Go语言位运算符

位运算符对内存中整数的二进制位进行运算。

位运算符比普通算术运算符更快,可以实现算术运算符无法实现的一些功能。如果你想开发高效的程序,位操作符是必不可少的。位运算符用于操作二进制位,包括按位AND(& amp;),按位OR (|),按位XOR(),按位左移()和按位右移()。

假设A=60,B=13,其二进制数转换如下。

A=0011 1100

B=0000 1101

Ab=0000 1100

A|B=0011 1101

A^B=0011 0001

Go语言支持的位运算符如下表所示。(假设A为60,B为13)

运算符

形容

例子

按位“与”运算符“”是双目运算符。它的作用是运算中涉及的两个数的对应二进制相位。

(AB)结果为12,二进制值为0000 1100。

|

按位“或”运算符“|”是双目运算符。它的作用是运算中涉及的两个数的二进制相位或。

(A|B)结果是61,二进制是0011 1101。

^

按位异或运算符“”是双目运算符。它的作用是运算中涉及的两个数对应的二进制位不同,或者当两个对应的二进制位不同时,结果为1。

(a b)结果为49,二进制值为0011 0001。

左移位运算符“”是双目运算符。向左移动n位乘以2的n次方。它的作用是将“”左边操作数的所有二进制位左移几位,而“”右边的数字指定要移动的位数,高位丢弃,低位填充0。

(A2)结果是240,二进制111 0000。

右移操作符“”是双目操作符。向右移动n位除以2的n次方。它的作用是将“”左边的操作数的所有二进制位向右移动几个位,而“”右边的数字指定了要移动的位数。

(A2)结果为15,二进制值为0000 1111。

表:位运算符

1,一点一点和

按位与(& amp):对两个数字进行运算,然后返回一个新的数字。当两个输入数字的相同位为1时,该数字的每个位需要为1。简单来说,如果同一位同时为1,则为1,如下图所示。

25263

252

一个

一个

一个

一个

一个

一个

0

0

63

0

0

一个

一个

一个

一个

一个

一个

60

0

0

一个

一个

一个

一个

0

0

表:按位“与”

22的二进制可以表示为11111100,63的二进制可以表示为0011111。每一位“与”运算后,结果为0011100,转换为十进制的结果为60。

2、按位或

按位OR (|):对两个数字进行运算,然后返回一个新的数字,只要任何输入数字的相同位是1,该数字的每个位都是1。简单来说:其中一个相同的位是1,也就是1,如下所示。

178|94

178

一个

0

一个

一个

0

0

一个

0

94

0

一个

0

一个

一个

一个

一个

0

254

一个

一个

一个

一个

一个

一个

一个

0

表:按位或

78的二进制可以表示为10110010,94的二进制可以表示为0101110。每一位或运算后,结果为11111110,十进制转换结果为254。

3.按位异或

Exclusive-OR by bit():对两个数字进行运算,然后返回一个新的数字。只要两个输入数字的相同位不同,该数字的每个位都是1,如果相同,则为0。简单来说:如果同一个位不同,那就是1,如下图。

20^5

20

0

0

0

一个

0

一个

0

0

0

0

0

0

0

一个

0

一个

17

0

0

0

一个

0

0

0

1

表:按位异或

20 的二进制可以表示为 00010100,5 的二进制可以表示为 00000101,将每一位都进行异或运算后结果为00010001,转换为十进制的结果为 17。

4、左移运算符

按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补 0。

1) 语法格式

需要移位的数字 << 移位的次数

例如,3 << 4,则是将数字 3 左移 4 位。

2) 计算过程

3 << 4

首先把 3 转换为二进制数字 0000 0000 0000 0000 0000 0000 00000011,然后把该数字高位(左侧)的 4 个 0 移出,其他的数字都朝左平移 4 位,最后在低位(右侧)的 4 个空位补 0。则得到的最终结果是 00000000 0000 0000 0000 0000 0011 0000,转换为十进制是 48。

3) 数学意义

在数字没有溢出的前提下,对于正数和负数,左移 1 位都相当于乘以 2 的 1 次方,左移 n 位就相当于乘以 2 的 n次方,如下所示。

 

 

3<<4

3

0

0

0

0

0

0

1

1

3<<4

0

0

1

1

0

0

0

0

48

3x2⁴

表:左移运算

3 的二进制可以表示为 00000011,将每一位向左移动 4 位,高位移出(舍弃),低位的空位补 0,运算结果为00110000,转换为十进制的结果为 48。

5、右移运算符

按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补 0,负数补 1。

1) 语法格式

需要移位的数字 >> 移位的次数

例如,11 >> 2,则是将数字 11 右移 2 位。

2) 计算过程

11 的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011,然后把低位的最后 2个数字移出,因为该数字是正数,所以在高位补 0。则得到的最终结果是 0000 0000 0000 0000 0000 0000 00000010。转换为十进制是 2。

3) 数学意义

右移 1 位相当于除以 2,右移 n 位相当于除以 2 的 n 次方,如下所示。

 

 

11>>2

11

0

0

0

0

1

0

1

1

11>>2

0

0

0

0

0

0

1

0

2

11÷2²

表:右移运算

11 的二进制可以表示为 00001011,每一位向右移动 2 位,低位移出(舍弃),高位正数补 0,运算结果为00000010,转换为十进制的结果为 2。

 

位运算符的用法,如下所示。

 

package     main

import "fmt"

func main() {

var a uint = 60

var b uint = 13

var c uint = 0

c = a & b

fmt.Printf("第一行 - c 的值为     %d \n", c)

c = a | b

fmt.Printf("第二行 - c 的值为     %d \n", c)

c = a ^ b

fmt.Printf("第三行 - c 的值为     %d \n", c)

c = a << 2

fmt.Printf("第四行 - c 的值为     %d \n", c)

c = a >> 2

fmt.Printf("第五行 - c 的值为     %d \n", c)

}

运行结果如下:

第一行 - c 的值为 12

第二行 - c 的值为 61

第三行 - c 的值为 49

第四行 - c 的值为 240

第五行 - c 的值为 15