Golang中位运算的详细理解

栏目: Go · 发布时间: 6年前

内容简介:前言:位运算可能在平常的编程中使用的并不多,但涉及到底层优化,一些算法及源码可能会经常遇见。今天就学习一下常用的位运算一、常用的位运算:

前言:

位运算可能在平常的编程中使用的并不多,但涉及到底层优化,一些算法及源码可能会经常遇见。今天就学习一下常用的位运算

一、常用的位运算:

&        AND

|       OR

^       异或 XOR

&^      位清空  (AND NOT)

<<      左移

>>      右移

二、位运算的用法:

位运算都是在二进制的基础上进行运算的,所以在位运算之前要先将两个数转成二进制

1.  &

& 只有两个数都是 1 结果才为 1

例: var i uint8 = 20  var j uint8=15    i&j

i 转成二进制为 0001 0100, j 转成二进制为 0000 1111

0001 0100 & 0000 1111 = 0000 0100

0001 0100 对应的十进制就是 4

2.  |

两个数有一个是结果就是 1

0001 0100 | 0000 1111 = 0001 1111

0001 1111 转成十进制就是 31

20 | 15 = 31

3. ^

1

^ 可以作为二元运算符,也可以作为一元运算符

^ 作二元运算符就是异或,相同为 0 ,不相同为 1

1^1 =0, 0^0=0,1^0=1,0^1=1

0001 0100 ^ 0000 1111 = 0001 1011

20 ^ 15 =27

2

^ 作一元运算符表示是按位取反

^0001 0100 = 1110 1011

故结果为 235

请思想下面代码的结果:

func main() {  
     var    i  uint8  = 20  
     fmt.Println(^i,^20)  
}  

结果是: 235   -21

why?

其实原因很简单,一个是有符号的数一个是无符号的数

20 在编译器中默认为 int 类型,故最高位是符号位,符号位取反,所以得到的结果是负数

串联理解:负数的二进制数怎么表示?

负数的二进制数是它对应的正数按位取反得到反码,再加上 1 得到的补码

例如: 3 的二进制为 00000000 00000000 00000000 00000011

反码: 11111111 11111111 11111111 11111100

补码:反码加 1 :   11111111 11111111 11111111 11111101

-3 的二进制为 11111111 11111111 11111111 11111101

所以, 一个有符号位的 ^ 操作为 这个数 +1 的相反数  

4.  &^

作用: 将运算符左边数据相异的位保留,相同位清零

1&^1   0
 1&^0   1
  0&^1   0
  0&^0   0

0001 0100 &^ 0000 1111 = 0001 0000

故结果为 16

5.  >> 右移   << 左移

左移和右移算是比较常见的运算了

左移规则:

右边空出的位用 0 填补

高位左移溢出则舍弃该高位

右移规则:

左边空出的位用 0 或者 1 填补。正数用 0 填补,负数用 1 填补。注:不同的环境填补方式可能不同;

低位右移溢出则舍弃该位

例: 0001 0100 >> 1 0000 1010    转成十进制为 10

0001 0100 << 1 0010 1000    转成十进制为 40


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

跨越

跨越

Lydia / 人民文学出版社 / 2018-4-1 / 39

三跨青年Lydia的一线奋斗笔记,抛却艰深理论,用亲身经验为你打通任督二脉。 揭开思维认知盲区,剖析成长潜在技巧,探知进阶背后逻辑,在拐点到来的时刻,推动人生加速上行。 10大职场潜在成长技巧,13种打破思维认知的的碎片重建,15种正确面对情感的能量释放, 38篇有世界 观,有方法论的故事,为你打开上升通道。 停留在思维层面的改变人生,其实已然陷入困境, 人生上行的实......一起来看看 《跨越》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具