位运算符——取反运算符~的理解

学习位运算符中的取反运算符—— ~ 时,要搞清楚以下几点:

  1. 正数的补码是其原码,原码就是其二进制数表示
  2. 负数的补码为符号位不变,原码取反再加一
  3. 二进制数有八位数,第一位就是符号位
  4. 符号位中,0代表正数,1代表负数
  5. 取反即1变0,0变1

这几点看不懂没关系,来举几个栗子就懂了。

1的原码:0000 0001(其中第一个0为符号位,表明它为正数)
1的补码:0000 0001(因为1是正数,所以补码是其原码)
对其取反:1111 1110
由于符号位变成了1,即是负数的表示,所以要再将其转换为补码,负数的补码转换为——符号位不变,原码取反再加一
原码取反:1000 0001(符号位不变,其余位依次取反)
再次加一:1000 0010
即1按位取反后为-2

-1的原码:1000 0001(第一位为1,即负数)
-1的补码:1111 1111(符号位不变,其余位依次取反再加一)
对其取反:0000 0000
即-1按位取反后为0

或者用简单的公式代入直接得结果:-(a+1)

再举几个栗子:

~7的结果是?

原码:0000 0111
补码:0000 0111
取反:1111 1000
取反:1000 0111
加一:1000 1000

or -( 7+1 ) =-8
~7等于-8

~-4的结果是?

原码:1000 0100
补码:1111 1100
反码:0000 0011

or -( -4+1 )=3
~-4等于3

扩展:快速写出二进制数的方法
128 64 32 16 8 4 2 1
8个数分别对应二的七次方、六次方、五次方、四次方、三次方、二次方、一次方、零次方
十进制数转换成二进制数,只用看这8个数中,有哪几个数相加可以得到此十进制数,就在哪一位上用1填充,其余用0填充。
譬如:12为8+4
则在上面8个数对应8和4的位置上用1填充
即:0000 1100

你可能感兴趣的:(笔记,c语言)