【发布时间】:2020-06-11 06:58:24
【问题描述】:
最近我在做一些与位操作有关的事情。到目前为止,我已经尝试了许多位操作操作。但我被困在一个操作上。
假设我有 int n = 5;二进制(101),现在我想在这个int上执行按位NOT,我认为结果是(010),而是结果是-6。
但是当我尝试 n = ~(-n) 时,它给了我结果 4(尽管仍然没有得到正确的输出)。请告诉它为什么显示这种行为是因为我的 int 不是无符号的。另外请告诉我实现操作的完美方法,以便我可以获得正确的输出。我的主要动机是正确翻转位。
谢谢
【问题讨论】:
-
int有超过 3 位。正如您正确猜测的那样,其中之一恰好是符号位。什么是“实现操作的完美方式”?你想按位而不是自己实现吗?你现在想实现什么操作,什么不完善? -
提示:
n = 5包含大量前导零(数量取决于int的大小)。您正在将输出中的前导零设置为 1。 -
@churill 我只是想实现像 (101) -> (010) 这样的 NOT 操作
-
您需要首先找到最重要的设置位,从中构造一个掩码,然后进行否定,最后屏蔽最高位。您的问题不清楚,因此您得到的答案恰好是 3 位,这可能不是您想要的。
-
@VaibhavBisht - 您必须计算出设置了多少位,然后只翻转这些位。这涉及的不仅仅是
~运算符。您还需要小心处理符号位(未指定或实现定义的元素 [不记得哪个副手] 对负值的行为)。此外,与~不同,这意味着两次应用您的方法不一定会返回原始值(101->010->001)。
标签: c++ c bit-manipulation bitwise-operators bit