40_Go基础_1_7 位运算

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6     /*
 7         位运算符:
 8             将数值,转为二进制后,按位操作
 9         按位&:
10             对应位的值如果都为1才为1,有一个为0就为0
11         按位|:
12             对应位的值如果都是0才为0,有一个为1就为1
13         异或^:
14             二元:a^b
15                 对应位的值不同为1,相同为0
16             一元:^a
17                 按位取反:
18                     1--->0
19                     0--->1
20         位清空:&^
21                 对于 a &^ b
22                     对于b上的每个数值
23                     如果为0,则取a对应位上的数值
24                     如果为1,则结果位就取0
25 
26         位移运算符:
27         <<:按位左移,将a转为二进制,向左移动b位
28             a << b
29         >>: 按位右移,将a 转为二进制,向右移动b位
30             a >> b
31     */
32 
33     a := 60
34     b := 13
35     /*
36         a: 60 0011 1100
37         b: 13 0000 1101
38         &     0000 1100
39         |     0011 1101
40         ^      0011 0001
41         &^    0011 0000
42 
43 
44         a : 0000 0000 ... 0011 1100
45         ^   1111 1111 ... 1100 0011
46     */
47     fmt.Printf("a:%d, %b\n", a, a) // a:60, 111100
48     fmt.Printf("b:%d, %b\n", b, b) // b:13, 1101
49 
50     res1 := a & b
51     fmt.Println(res1) // 12
52 
53     res2 := a | b
54     fmt.Println(res2) // 61
55 
56     res3 := a ^ b
57     fmt.Println(res3) // 49
58 
59     res4 := a &^ b
60     fmt.Println(res4) // 48
61 
62     res5 := ^a
63     fmt.Println(res5) // -61
64 
65     c := 8
66     /*
67         c : ... 0000 1000
68               0000 100000
69         >>        0000 10
70     */
71     res6 := c << 2
72     fmt.Printf("%d,%b\n", res6, res6) // 32,100000
73 
74     res7 := c >> 2
75     fmt.Printf("%d,%b\n", res7, res7) // 2,10
76 }