loong博客

golang位运算符

目录

  • 位运算符
  • 参考示例

位运算符

Go支持六种位运算符。

标识含义
&位与
|位或
^异或
&^清位
<<左移位
>>右移位
  • &

参与运算的两个操作数对应的二进制按位相与,均为1才为1。

  • |

参与运算的两个操作数对应的二进制按位相或,有一个为1就为1。

  • ^

参与运算的两个操作数对应的二进制按位相异或,当对应的二进位不一样则为1。

  • &^

将运算符左侧的操作数特定位清除(设为0)。运算符右侧的操作数(二进制表示)对应的某位如果是0,则左侧操作数对应位保持不变;如果是1,则左侧操作数对应位清零。a &^ b 与 a & (^b) 功能相同。

  • <<

将一个二进制位的操作数按指定位数整体向左移动,低位补零。

  • >>

将一个二进制位的操作数按指定位数整体向右移动,在右移运算中,左边空出来的位(即高位)全部用左操作数的最高位(即正负号位)填充。 比如左操作数-128 (二进制补码表示为10000000),则10000000 >> 2的二进制补码结果为11100000(即-32)。

参考示例


package main

import "fmt"

func main() {
    // 二进制表示为 0000000000001010
	a := 10                                             
    // 二进制表示为 0000000000000110
	b := 6 
    // 二进制表示为 1111111110000000
	c := -128                                           
    // 输出8 (二进制为 0000000000001000)
	fmt.Printf("清位: %d, %016b\n", a&^b, a&^b)
    // 输出12 (二进制为 0000000000001100)
	fmt.Printf("异或: %d, %016b\n", a^b, a^b)
    // 输出-512 (二进制为 1111111000000000)
    fmt.Printf("左移: %d, %016b\n", c<<2, uint16(c<<2)) 
    // 输出-32 (二进制为 1111111111100000)
	fmt.Printf("右移: %d, %016b\n", c>>2, uint16(c>>2))
}