• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

go中异或运算带来的疑惑 原码、反码、补码 详解!不懂的请看过来! ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

最近在看go,遇到一个问题:

一时没看明白一元运算的异或运算是如何得到结果值的,代码如下:

var b uint8 = 15
var c int8 = 15

fmt.Printf(" b: %08b \n", b)
fmt.Printf("^b: %08b \n", ^b)
fmt.Printf(" c: %08b \n", c)
fmt.Printf("^c: %08b \n", ^c)

// 执行结果
 b: 00001111 
^b: 11110000 
 c: 00001111 
^c: -0010000 
按位补足 ^ : 该运算符与异或运算符一同使用,即 m^x,对于无符号x使用“全部位设置为1”,对于有符号x 时使用 m=-1 。

看上面的代码,和解释,对于无符号数值的运算比较好理解:

^15 

等价于  1111 1111 ^ 0000 1111   

结果:  1111 0000

但对于有符号数是如何计算出  -0010000 的呢?先上计算过程

^15 

等价于  -1^15

等价于 1000 0001 ^ 0000 1111   (这里是原码)

等价于 1111 1111 ^   0000 1111  (这里是补码)

结果  1111 0000  (这里是补码)

结果转为原码  1000 1111 (补码) +1  --> 1001 000 (原码)

 

涉及的概念:

原码、反码、补码,及转换过程

 

 

 真值:符号位+数字的绝对值 就是真值:例如:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1

这里还有一个概念:就是在系统中,数值使用补码来表示(存储)

原因:可以看这里 https://zhuanlan.zhihu.com/p/91967268

 

由补码求原码

  - 如果补码的符号位为“0”,表示为正数,所以补码就是该数的原码。

  - 如果补码的符号位为“1”,表示为负数,求原码的操作是:符号位不变,即为1,其余各位取反,然后再整个数加1

  示例

  1111 0000 -> 1000 1111 ->1000 1111 + 1 -> 1001 0000 

 

反码通常是用来做 原码和补码转码的过渡。

 

其实是很基础的知识,但是多年没接触过,导致忘光了

如果想复习的话,可以看一下这里

原码、反码、补码 详解!不懂的请看过来! 

https://www.cnblogs.com/resn/p/13396630.html  

   

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap