分享
  1. 首页
  2. 文章

Golang中位运算的详细理解

kwame211 · · 1333 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kwame211/article/details/79193164

前言:

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

一、常用的位运算:

& 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 结果就是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

请思想下面代码的结果:

[plain] view plain copy
  1. func main() {
  2. var i uint8 = 20
  3. fmt.Println(^i,^20)
  4. }


结果是: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 >> 10000 1010 转成十进制为10

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


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:kwame211

查看原文:Golang中位运算的详细理解

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1333 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏