C按位否定会产生负输出:

Miz*_*mor 6 c bit-manipulation

我真的很难翻转C int变量中的位.我是这样做的:

input = 15;

input = ~input;

printf("%d", input);
Run Code Online (Sandbox Code Playgroud)

但它总是显示为-16.应该是0!如果15写的是1111,为什么会回来10000?!这令人抓狂!有人能帮帮我吗!?

das*_*ght 13

由于int您的系统很可能是32位数字,因此所有位都被翻转,包括原始数字中无效的零:

00000000000000000000000000001111
Run Code Online (Sandbox Code Playgroud)

11111111111111111111111111110000
Run Code Online (Sandbox Code Playgroud)

这是一个负数:最重要的位15是零,因此它1在翻转时变为零.

如果您只想保留原始数字的位,则需要在数字的重要位置屏蔽所有数字,如下所示:

printf("%d\n", input & 0xF);
Run Code Online (Sandbox Code Playgroud)

AND与荷兰国际集团0xF"切断",除了过去四年所有位.


小智 5

这是因为input由超过四位组成.如果我们假设input是a signed char,有8位(或一个字节),那么:

input == 15 == 0x0F == 0b00001111
Run Code Online (Sandbox Code Playgroud)

如您所见,4个更重要的位input都是0.在按位NOT操作(〜)之后,我们有:

~input == -16 == 0xF0 == 0b11110000
Run Code Online (Sandbox Code Playgroud)

过去为零的四位现在是1,现在为零.有符号变量中最重要的位确定其符号(0表示正数,1表示负数).因此,通过翻转符号,符号已被反转.负数可以理解为:

1      1     1     1     0     0     0   0
-128 + 64  + 32  + 16  + 0   + 0   + 0 + 0
Run Code Online (Sandbox Code Playgroud)

这解析为打印的-16.

如果您的作业是使用按位NOT将变量归零,请尝试声明inputunsigned char避免担心符号位.然后,设置input2558位变量可以保持(0xFF0b11111111)的最高值.