首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C语言学习——位运算

C语言学习——位运算

作者头像
全栈程序员站长
发布2022-09-23 20:12:30
发布2022-09-23 20:12:30
1K0
举报

大家好,又见面了,我是你们的朋友全栈君。

原码反码补码介绍

原码 就是前面所介绍的二进制定点表示法,即最高位为符号位,“ 0 ”表示正,“ 1 ”表示负,其余位表示数值的大小。

反码 表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码 表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加 1 。

补码详细介绍

补码是为了表示一个负数的二进制形式。 其转化方式是,先将负数当成正数,转化成二进制的形式,再将二进制正数的各个位上取反,再加上一。

例如-5 先求出5的二进制数 : 0000 0000 0101 然后将各个位上0变1,1变0 : 1111 1111 1010 最后再加1 : 1111 1111 1011

按位与(&)

运算的两个数,转换算为二进制后,进行与(&)运算。 当相应位上的数都是1时,该位取1,否则该为0。

例如5 & -5 5 : 0000 0000 0101 -5 :1111 1111 1011 答案 : 0000 0000 0001

按位或(|)

运算的两个数,转换为二进制后,进行或(|)运算。 只要相应位上存在1,那么该位就取1,如果都不为1,就为0。

还是5 | -5 0000 0000 0101 1111 1111 1011 可以看到每一位中其中一个都有1 答案 :1111 1111 1111

按位异或(^)

运算的两个数,转换成二进制数后,进行异或(^)运算 如果相应位置上的数相同,该位取0,如果不同改位取1。

5 ^ -5 0000 0000 0101 1111 1111 1011 答案: 1111 1111 1110

同时任何数异或0都是其本身,一个数如果异或自己则等于0 这样我们可以用异或来交换两个数的值

比如交换x,y的值 x ^= y; x = x ^ y y ^= x; y = y ^ x ^ y x ^= y; x = ( x ^ y ) ^ (y ^ x ^ y) ; ——— //最后一步 x ^= y 时 x = x ^ y; y = y ^ x ^ y

左移(<<)

将一个数二进制下的数向左移若干位, 比如 x << y 就是将二进制下的x 向左移 y 位

例 : 5 << 5 5 : 0000 0000 0101 5 << 5 : 0000 1010 0000 在10进制下就等于160

我们可以思考一下,在十进制中,一个数每乘一次10就向左进一位。 那么在二进制中,同10进制一样,二进制中每乘一次2就向左进一位, 那么一个数左移x 就等价于一个数乘 2x。

右移(>>)

将一个数在二进制下右移若干位 与左移用法相同

例 5 >> 2 5:0000 0000 0101 5 >> 2 : 0000 0000 0001 十进制下等于1

这里与左移类似,十进制下每除10整数位就退一位 那么右移就等价于除了几次2 同时右移运算是向下取整的

取反(~)

其实在说补码的时候,取反就已经说了,就是将取反的数在二进制下的每一位取相反的数

5 : 0000 0000 0101 ~5 : 1111 1111 1010

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170962.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原码反码补码介绍
  • 补码详细介绍
  • 按位与(&)
  • 按位或(|)
  • 按位异或(^)
  • 左移(<<)
  • 右移(>>)
  • 取反(~)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档