golang中位运算符与移位

位运算符

  • 取反是一元运算符,对一个二进制数的每一位执行逻辑反操作。
NOT 0111(十进制7)
  = 1000(十进制8)

许多程序设计语言,取反操作符用波浪线”~“表示。

  • 按位或处理两个长度相同的二进制数,两个相应的二进位只要有一个为1,该位的结果值为1
    0101(十进制5)
 OR 0011(十进制3)
  = 0111(十进制7)

按位或操作符是"|"

  • 按位异或对等长二进制数的每一位执行逻辑异或操作。操作的结果是如果某位不同则该位为1,否则该位为0.
     0101
 XOR 0011
   = 0110

按位异或运算符是"^"

  • 按位与处理两个长度相同的二进制数,两个相应的二进位都为1,该位的结果值才为1, 否则为0
     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

移位

移位是一个二元运算符,用来将一个二进制数中的每一位全部都向一个方向移动指定位,溢出的部分将被舍弃,而空缺的部分填入一定的值。

   0001(十进制1)
<<    3(左移3位)
 = 1000(十进制8)

左移用"<<"表示

   1010(十进制10)
>>    2(右移2位)
 = 0010(十进制2)

右移用">>"表示

位运算符、移位在golang中应用

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 )
}
posted @ 2020-12-20 13:49  viletyy  阅读(1805)  评论(0编辑  收藏  举报