C中的按位NOT

时间:2014-04-24 16:54:39

标签: c bit-manipulation

我有一个简单的应用程序:

#include <stdio.h>

int main(int argc, char **argv)
{
  unsigned int a = 0x2; //= 10b
  unsigned int b = ~a;  // should be 01b
  printf("%04x : %04x\n", a, b);
}

我想知道,为什么打印0002 : fffffffd而不是0002 : 0001

4 个答案:

答案 0 :(得分:4)

fffffffd(hex) -> 11111111111111111111111111111101(binary)
00000002(hex) -> 00000000000000000000000000000010(binary)

正如你所看到的,他们是彼此的逐渐否定。

答案 1 :(得分:1)

02x是一个整数常量。在与0x00000002对应的32位系统上,仅省略了无效的零。当您反转该值时,您将返回0xfffffffd - 正好是您看到的值。

如果您只想保留最后两位,请使用0x03进行掩码,如下所示:

unsigned int b = ~a & 0x03;  // will be 01b

Demo on ideone.

答案 2 :(得分:1)

基本上,你是对的。但是,无符号整数(通常)是32位长(在32位系统上)。

所以你不仅要翻过最后两位,还要翻过30位。

要解决这个问题,您只需要屏蔽您感兴趣的位:

#include <stdio.h>

int main(int argc, char **argv)
{
    unsigned int a = 0x2;       //= 10b
    unsigned int b = ~a & 0x3;  //= 01b (0x3 = 11b)
    printf("%04x : %04x\n", a, b);
}

答案 3 :(得分:0)

这是因为2以二进制o(在32位机器上)表示为

00000000000000000000000000000010  

及其按位​​NOT是

11111111111111111111111111111101 

相当于十六进制中的fffffffd