位运算符号: & 、|、 ^、 ~、 <<、 <<<、 >>、 >>>
& 按位与
运算规则: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 / (2的1次方) = 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(机器中所看到的值)
计算机中存的是补码 做运算也使用的都是补码
不继续深入了。主要是为了看懂基本位运算。