Go语言位运算
一、二进制
二进制是逢二进一的进位制,0,1是基本算符
在计算机内部,运行各种运算时,都是以二进制的方式运行
二、原码、反码、补码
对于有符号的而言:
- 二进制的最高位是符号位,0表示正数,1表示负数
- 正数的原码、反码、补码都一样
- 负数的反码=它的原符号位不变,其他位取反(0->1,1->0)
- 负数的补码=它的反码+1
- 0的反码,补码都是0
- 在计算机运算的时候,都是以补码的方式来运行的
例子:
1 ===> 原码[0000 0001] 反码[0000 0001] 补码[0000 0001]
-1 ===> 原码[1000 0001] 反码[1111 1110] 补码[1111 1111]
三、位运算符
运算符 | 描述 |
---|---|
& | 按位于,是双目运算符,其功能是参与运算的两数各对应的二进位相与,运算规则是:同时为1结果为1,否则为0 |
| | 按位或,是双目运算符,其功能是参与运算的两数各对应的二进位相或,运算规则是:有一个位1,结果为1,否则为0 |
^ | 按位异或,是双目运算符,其功能是参与运算的两数各对应的二进位相异或,运算规则是:当二进位不同时,结果为1,否则为0 |
<< | 左移,是双目运算符,其功能是把"<<"左边的运算数的各二进位全部左移若干位,高位丢弃,低位补0。左移n位就是乘以2的n次方,运算规则是:符号位不变,低位补0 |
>> | 右移,是双目运算符,其功能是把">>"左边的运算数的各二进位全部右移若干位。右移若干位就是除以2的n次方,运算规则是:低位溢出,符号位不变,并用符号位补溢出的高位 |
案例1:
2&3
2&3
2的补码:0000 0010
3的补码:0000 0011
2&3: 0000 0010 ==> 2
2&3的结果为2
案例2
2|3
2|3
2的补码:0000 0010
3的补码:0000 0011
2|3: 0000 0011 ==> 3
2|3的结果为3
案例3
2^3
2^3
2的补码:0000 0010
3的补码:0000 0011
2^3: 0000 0001 ==> 1
2^3的结果为1
案例4
-2^2
-2^2
-2的原码:1000 0010 ==> 反码:1111 1101 ==> 补码:1111 1110
2的补码: 0000 0010
-2^2: 1111 1100(补码)==> 反码:1111 1011 ==> 原码: 1000 0100 ==> -4
-2 ^ 2的结果为-4(注意-2^2的结果是负数,要从补码反推出原码)
案例5
8>>2
8的补码:0000 1000
8>>2: 0000 0010 ==>2
8>>2的结果为2
案例6
8<<2
8的补码:0000 1000
8<<2: 0010 0000 ==>32
8<<2的结果为32
案例7
-8>>2
-8的原码: 1000 1000 ==> 反码: 1111 0111 ==> 补码: 1111 1000
-8>>2: 1111 1110(补码) ==>反码:1111 1101 ==>原码:1000 0010 ==>-2
-8>>2的结果为-2(注意-8>>2的结果是负数,要从补码反推出原码)