位运算

646 阅读2分钟

位运算符号: & 、|、 ^、 ~、 <<、 <<<、 >>、 >>>

& 按位与

运算规则:0&0=0;  0&1=0;   1&0=0;    1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0
举例:7 & 5           20 & 7
7 = 0000 0111        20 = 0001 0100
&   ↓↓↓↓ ↓↓↓↓         &   ↓↓↓↓ ↓↓↓↓
5 = 0000 0101         7 = 0000 0111
    ↓↓↓↓ ↓↓↓↓             ↓↓↓↓ ↓↓↓↓
5 = 0000 0101         4 = 0000 0100

| 按位或

运算规则:0|0=0;  0|1=1;  1|0=1;   1|1=1;
即: 两位只要有一位为“1”,结果就为“1”,否者为“0”
举例:7 | 5           20 | 7
7 = 0000 0111        20 = 0001 0100
|   ↓↓↓↓ ↓↓↓↓         |   ↓↓↓↓ ↓↓↓↓
5 = 0000 0101         7 = 0000 0111
    ↓↓↓↓ ↓↓↓↓             ↓↓↓↓ ↓↓↓↓
7 = 0000 0111        23 = 0001 0111

^ 按位异或

运算规则:0^0=0;  0^1=1;  1^0=1;   1^1=0;
即:两位中值不一样(异)就为“1”,否者为“0”
举例:7 ^ 5           20 ^ 7
7 = 0000 0111        20 = 0001 0100
^   ↓↓↓↓ ↓↓↓↓         ^   ↓↓↓↓ ↓↓↓↓
5 = 0000 0101         7 = 0000 0111
    ↓↓↓↓ ↓↓↓↓             ↓↓↓↓ ↓↓↓↓
2 = 0000 0010        19 = 0001 0011

~取反

运算规则:~0 = 1,, ~1 = 0;  ~x = -(x+1)

<< 左移

运算规则: x << y    等于   x * (2的y次方)
x << 1   =  x * (2的1次方)  =  x值的翻倍。

>> 右移

运算规则: x >> y    等于   x / (2的y次方) = (如果有小数就舍弃小数点后的)
x >> 1   =  x / (21次方)  =  x值的一半

字节之类的

字节: byte 1字节 8位 范围: -128 ~ 127

第一位是符号位。0表示+  1表示-。  1000 0000 ~ 0111 1111 这里有个纠结点。-128 = -0
遇到的1111 1111 并不是表示的-127.因为这个值(255)已经超过了一个字节。所以应该用16位来表示
0000 0000 1111 1111 所以等于正数的255。

正数的原码反码补码都是一样的。比如5 都是 0000 0101

5的源码反码补码的表示方法:

原码: 将一个整数,转换成二进制,就是其原码。第一位是符号位。0表示+ 1表示-

5 = 0000 0101, -5 = 1000 0101(并不是在机器中显示的值)

反码: 正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。

5 = 0000 0101, -5 = 1111 1010

补码:正数的反码就是其原码;负数的补码为“其反码+1”

5 = 0000 0101, -5 = 1111 1011(机器中所看到的值)

计算机中存的是补码 做运算也使用的都是补码

不继续深入了。主要是为了看懂基本位运算。