1、位移运算
原码
反码 = 原码取反
补码 = 反码 + 1
<<表示左移,不分正负数,低位补0;
方式一:补码左移几位,然后再转回原码
方式二:左移几位,乘以2的几次方
举例:
20 << 2
00010100 :20
11101011 :反码
11101100 :补码(+1)
10110000 :补码左移2位
10101111 :反码(-1)
01010000 :原码
2*2*2*2*2*2 + 2*2*2*2 = 64 + 16 = 80
20 * 2 * 2 = 80
-20 << 2
10010100 :-20
11101011 :反码
11101100 :补码(+1)
10110000 :补码右移2位
10101111 :反码(-1)
11010000 :原码
2*2*2*2*2*2 + 2*2*2*2 = 64 + 16 = -80
20 * 2 * 2 = -80
>>表示右移,如果该数为正,则高位补0,若为负数,则高位补1;
方式一:补码右移几位,然后再转回原码
方式二:右移几位,除以2的几次方
举例:
20 >> 2
00010100 :20
11101011 :反码
11101100 :补码(+1)
00111011 :补码右移2位
00111010 :反码(-1)
00000101 :原码
2*2 + 2*1 = 5
20 / 4 = 5
-20 >> 2
10010100 :-20
11101011 :反码
11101100 :补码(+1)
11111011 :补码右移2位
11111010 :反码(-1)
10000101 :原码
2*2 + 2*1 = -5
20 / 4 = -5
>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0;
举例:
20 >>> 2
00010100 :20
11101011 :反码
11101100 :补码(+1)
00111011 :补码右移2位
00111010 :反码(-1)
00000101 :原码
2*2 + 2*1 = 5
20 / 4 = 5
-20 >>> 2
10010100 :-20
11101011 :反码
11101100 :补码(+1)
10011011 :补码右移2位
10011010 :反码(-1)
11100101 :原码
2、常见写法
n / 2 -> n >> 1
n * 2 -> n << 1
n * 2 + 1 -> (n << 1) | 1
举例:
20 << 1
00010100 :20
11101011 :反码
11101100 :补码(+1)
11011000 :补码左移1位
11010111 :反码(-1)
00101000 :原码
2*2*2*2*2 + 2*2*2 = 32 + 8 = 40
20 * 2 = 40
20 * 2 + 1 = (20 << 1) | 1
00101000 | 00000001 = 00101001