- 在这里先补充原码、补码、反码的一点知识:
-
- 正数的反码、补码都与原码一样
- 负数的反码、补码与原码不同。
反码:原码中除去符号位,其他数值位取反
补码:反码+1
Demo
|
7
|
-7
|
原码
|
00000111
|
10000111
|
反码
|
00000111
|
11111000
|
补码
|
00000111
|
11111001
|
- 按位操作符包括:
-
- 按位“与“---& 如果两个输入位都是1,则会生成一个输出位1,否则生成一个输出位0。 如:00000101 & 00000011 会得到 00000001
- 按位“或”---| 如果两个输入位里只要有一个是1,就会生成一个输出位1,只有在两个输出位都是0时,才会生成一个输出位0。 如:00000101 | 00000011 会得到 00000111
- 按位“亦或”---^ 如果输入位里有一个是1,但不全都是1,那么生成一个输出位1。 如:00000101 & 00000011 会得到 00000110
- 按位“非”--- ~ (一元操作符) --->>>这个是重点,我也是搞了半天才搞清楚,这个要用到原码、反码、补码的知识了
对于负数而言,比如想得到“~(-5)”的结果:
-
-
- 原码: 1(符号位) 0000101
- 取反码: 1(符号位) 1111010
- 取补码: 1(符号位) 1111011
- ~操作: 0(符号位) 0000100 【这里是全部取反而不是取反码】
- 结果: 4
-
对于正数而言,比如想得到“~5”的结果:
-
-
- 原码: 0(符号位) 0000101
- 取反码: 0(符号位) 0000101
- 取补码: 0(符号位) 0000101
- ~操作: 1(符号位) 1111010 【同上】
- 取反码: 1(符号位) 0000101
- +1: 1(符号位) 0000110
- 结果: -6
-
结论:这个过程很容易就搞乱了,最终参考了各位大牛的一个口诀:不论正数负数,进行按位“非”操作的结果都是: -(数值+1)