位运算符
- 取反是一元运算符,对一个二进制数的每一位执行逻辑反操作。
1
2
NOT 0111(十进制7)
= 1000(十进制8)
许多程序设计语言,取反操作符用波浪线”~“
表示。
- 按位或处理两个长度相同的二进制数,两个相应的二进位只要有一个为1,该位的结果值为1
1
2
3
0101(十进制5)
OR 0011(十进制3)
= 0111(十进制7)
按位或操作符是"|"
- 按位异或对等长二进制数的每一位执行逻辑异或操作。操作的结果是如果某位不同则该位为1,否则该位为0.
1
2
3
0101
XOR 0011
= 0110
按位异或运算符是"^"
- 按位与处理两个长度相同的二进制数,两个相应的二进位都为1,该位的结果值才为1, 否则为0
1
2
3
0101
AND 0011
= 0001
按位与操作符是"&"
位运算符对整数在内存中的二进制位进行操作
p | q | p&q | p|q | p^q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
移位
移位是一个二元运算符,用来将一个二进制数中的每一位全部都向一个方向移动指定位,溢出的部分将被舍弃,而空缺的部分填入一定的值。
1
2
3
0001(十进制1)
<< 3(左移3位)
= 1000(十进制8)
左移用"<<"
表示
1
2
3
1010(十进制10)
>> 2(右移2位)
= 0010(十进制2)
右移用">>"
表示
位运算符、移位在golang中应用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main
import "fmt"
func main(){
var a uint = 60 /* 60 = 0011 1100*/
var b uint = 13 /* 13 = 0000 1101*/
var c uint = 0
c = a & b /* 12 = 0000 1100 */
fmt.Printf("第一行 - c 的值为 %d\n", c )
c = a | b /* 61 = 0011 1101 */
fmt.Printf("第二行 - c 的值为 %d\n", c )
c = a ^ b /* 49 = 0011 0001 */
fmt.Printf("第三行 - c 的值为 %d\n", c )
c = a << 2 /* 240 = 1111 0000 */
fmt.Printf("第四行 - c 的值为 %d\n", c )
c = a >> 2 /* 15 = 0000 1111 */
fmt.Printf("第五行 - c 的值为 %d\n", c )
}