C 整数值上的~做什么?此操作的用法

C 整数值上的~做什么?此操作的用法,c,bit-manipulation,C,Bit Manipulation,我想知道int值上的~运算有什么作用。 我编码并打印了~a,其中a被指定为3,它给出了-4。 请告诉我它的用法。~是按位NOT运算符(补码)。它将位0切换到1和1切换到0。在32位机器上,十进制3为 00000000 00000000 00000000 00000011 (2's complement) 11111111 11111111 11111111 11111100 = -4 按位补码等于值减去1的两个补码(~x=−x− 1)。因此,~3是 00000000 00000000

我想知道int值上的~运算有什么作用。 我编码并打印了~a,其中a被指定为3,它给出了-4。
请告诉我它的用法。

~
是按位NOT运算符(补码)。它将位
0
切换到
1
1
切换到
0
。在32位机器上,十进制
3

00000000 00000000 00000000 00000011  (2's complement)  
11111111 11111111 11111111 11111100 = -4
按位补码等于值减去1的两个补码(
~x=−x− 1
)。因此,
~3

00000000 00000000 00000000 00000011  (2's complement)  
11111111 11111111 11111111 11111100 = -4

将所有位反转,它将
0000101
->
11101010
例如一元运算符,生成二进制值的按位NOT或补码

在使用有符号整数的情况下:

 a = 3 = 0b00000011

~a = -4 = 0b11111100

它是一元补码运算符,或按位not运算符。它翻转数字中的所有位


在有符号整数的情况下,通常最高位存储符号(2的补码存储),因此正数的补码产生负数,反之亦然(0和最小负值除外)。

它是按位补码运算符。可以看到更多信息,但本质上正如其他答案所述,它将二进制位从
0
翻转到
1
1
0

例如,如果十进制值
15
以二进制格式表示为

1111
如果你取
15
的位补码,就像
~15
一样,它的二进制格式会产生

0000

这显然是十进制的
0

一个人的补码~翻转位。在您的示例中,00000011被更改为111111 00,假设它是一个8位数字

请参阅以下C中的按位运算图表


~是按位NOT运算符,这将翻转位模式。假设位值为1010,此按位NOT运算符将模式翻转为0101

~
运算符接受任何整数类型的操作数,并返回反转位值

它不会更改操作数本身的值(例如,与
++
--
相反)

它主要用于位屏蔽

示例#1:

  • 计算位#5设置为0且所有其他位设置为1的掩码:


    int mask=~(1答案如下:[@user2120978,没错!这怎么可能是第一次有人问这个问题。谢谢,但我在这里没能很快找到。所以我想再发一次。否决我答案的人能告诉我需要编辑什么吗?它是一个运算符,而不是一个操作数。根据建议编辑。示例仅适用于
    ~15==0
    关于4位无符号整数,它通常不会出现在C中(结构位字段除外)。@pat你完全正确。我只是用它作为一个例子,说明位是如何通过补码变化的。