& 和 && 的区别,| 和||的区别?
不管右边结果是什么,都要去执行左边。
^ 和 | 的区别,当两边都为true时返回false。
进制的转换:
十进制转二进制:对十进制除以2,如: 6 = 110
二进制转十进制:二进制乘以2,如 110 ,0*2(0)+1*2(1)+1*2(2)
二进制转十六进制:四个二进制就是一个16进制位。
如:0101 1010 = 5 10,在十六进制里10代表A,十六进制前加0x,所以这里是0x5A
二进制转八进制:三个二进制位代表一个8进制位,不足补0
如:0101 1010 = 132
二进制中负数的表达形式:
如: 6 = 110
6是int 型的话,以32个进制位表示,即
0000-0000 0000-0000 0000-0000 0000-0110
而6的负数表示,则是将6的二进制取反,即
1111-1111 1111-1111 1111-1111 1111-1001
取反后,再加上1,1的二进制表达形式是:
0000-0000 0000-0000 0000-0000 0000-0001
进行相加
1111-11111111-1111 1111-1111 1111-1001
+0000-0000 0000-0000 0000-0000 0000-0001
=1111-1111 1111-1111 1111-1111 1111-1010
最后相加的结果就是:-6
负数的最高位都是为1,相反,为0则为正数
位运算符:
<< 左移:
例:6 << 2
0000-0000 0000-0000 0000-0000 0000-0110 这是6的二进制位
将这个二进制向左移动2位,后面补0,即:
00-0000 0000-0000 0000-0000 0000-011000
这里的结果是24
>> 右移
例:5 >>2
0000-0000 0000-0000 0000-0000 0000-0101 这是5的二进制位
将这个二进制向右移动2位,移出的2位去掉,前面补0,即:
000000-0000 0000-0000 0000-0000 0000-01
这里的结果就是1
>>> 无符号右移 和 >>右移的 区别:
>>右移时补位是需要根据这个二进制位最高位决定,如果最高位为1,则补1,最高为0,则补0。
而>>> 无论最高位为0或者1,都补0。、
左移:拿这个数 * 2 (移动位数次幂)
右移:拿这个数 / 2 (移动位数次幂)
& 与运算
例:6 & 2
先转成二进制:
0000-0000 0000-0000 0000-00000000-0110
& 0000-0000 0000-0000 0000-0000 0000-0010
= 0000-0000 0000-0000 0000-0000 0000-0010
结果:2
| 或运算
例:7 | 3
先转成二进制:
0000-0000 0000-0000 0000-00000000-0111
|0000-0000 0000-0000 0000-0000 0000-0011
=0000-0000 0000-0000 0000-0000 0000-0111
结果:7
^ 异或运算
例:9 ^ 3
先转成二进制:
0000-0000 0000-0000 0000-00000000-1001
^ 0000-0000 0000-0000 0000-0000 0000-0011
=0000-0000 0000-0000 0000-0000 0000-1010
结果:12
一个数异或同一个数2次,结果还是那个数。
实例:不用第三方变量,将两个变量的值进行交换。
int n = 3;
int m = 8;
n = n ^ m;
n = 0000-0000 0000-0000 0000-0000 0000-0011
m = 0000-0000 0000-0000 0000-0000 0000-0110
n = 0000-0000 0000-0000 0000-0000 0000- 0101
m = n ^ m;
n = 0000-0000 0000-0000 0000-00000000- 0101
m = 0000-0000 0000-0000 0000-0000 0000-0110
m = 0000-0000 0000-0000 0000-0000 0000-0011
n = n ^ m;
n = 0000-0000 0000-0000 0000-0000 0000-0101
m = 0000-0000 0000-0000 0000-0000 0000-0011
m = 0000-0000 0000-0000 0000-0000 0000-0110
~反码
就是将一个数的二进制取反