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