当前位置:网站首页>按位取反怎么运算_按位取反运算
按位取反怎么运算_按位取反运算
2022-08-03 09:44:00 【全栈程序员站长】
大家好,又见面了,我是你们的朋友全栈君。
首先搞懂 “反码”,“取反”,“按位取反(~)”,这3个概念是不一样的。
取反:0变1,1变0
反码:正数的反码是其本身,对于负数其符号位不变其它各位取反(0变1,1变0)
按位取反(~): 这将是下面要讨论的。
————————————————————————————————-
“~”运算符在c、c++、java、c#中都有,之前一直没有遇到这个运算符。
要弄懂这个运算符的计算方法,首先必须明白二进制数在内存中的存放形式,二进制数在内存中是以补码的形式存放的。
另外正数和负数的补码不一样,正数的补码、反码都是其本身,既:
正数9:
- 取原码: 0000 1001
- 取补码: 0000 1001
- 取反码: 0000 1001
- 内存中存放格式 0000 1001
再例如: -2
- 取原码: 1000 0010 (最高位1表示符号位)
- 取反码: 1111 1101 (符号位不变,其余各位求反)
- 取补码: 1111 1110 (反码末位+1)
- 内存中存放格式: 1111 1110
————————————————————————————————-
弄懂了上述情况后,按位取反如何计算就好办了
假设要对正数9按位取反——> (~9),计算步骤如下,
- 取原码 0000 1001,
- 取反码 0000 1001,
- 取补码 0000 1001,
- 对其取反 1111 0110(符号位一起进行取反,这不是最终结果,只是补码的取反仅此而已)
我们还需要把他转换成原码,由于最高位是1代表负数,下面进行负数补码到原码的逆运算先减1得反码: 1111 0101取反得原码:1000 1010,(取反过程符号位不变)前面最高位1是符号位,既得十进制:-10不知道说的明不明白,这里步骤就是:1. 先对正数求补码2. 然后对补码取反,包括符号位3. 最后进行补码求原码的逆过程。
经评论区朋友指正:原推算过程存在错误,很巧合的是当时用来举例的9按照错误的推算过程也可以获得正确的结果(用5可以推翻这个结论是错误的)。 现更新计算过程:接上面对 0000 1001 取反后得到 1111 0110,由于计算机需要以补码表示,需要对该值获取补码才能获得最终结果
- 取原码:1111 0110
- 取反码:1000 1001 (符号位不变,其余各位求反)
- 取补码:1000 1010 (反码+1)
最终结果是 1000 1010,也就是-10
————————————————————————————————-
再对正数5按位取反——> (~5),计算步骤如下
原码,反码,补码皆为 0000 0101
对其取反 1111 1010(符号位一起进行取反)
取反码:1000 0101(符号位不变,其余各位求反)
取补码:1000 0110 (反码+1)
最终结果 1000 0110 ,也就是-6
————————————————————————————————-
下面我们再计算 (~ -10)
-10的原码:1000 1010
-10的反码:1111 0101 (符号位不变)
-10的补码:1111 0110 (反码+1)
补码取反:0000 1001 (符号位一起取反)
正好得到一个正数,那么对其求原码就可得到最终结果
再因正数的补码,反码,原码都一样,最终结果是 0000 1001 ,正好是9的二进制。
————————————————————————————————-
最后一个有趣的事实是:
1. 所有正整数的按位取反是其本身+1的负数
2. 所有负整数的按位取反是其本身+1的绝对值
3. 零的按位取反是 -1(0在数学界既不是正数也不是负数)
// 测试-1亿 到 1亿的所有整数 :)
for (int i = 0; i <= 100000000;++i)
{
if (~i != -(i+1) ) {
__asm { cli } // 汇编中断指令
}
if (i && ~(-i) != abs((-i)+1) ) {
__asm { cli }
}
}
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/125099.html原文链接:https://javaforall.cn
边栏推荐
猜你喜欢
C# Color颜色RGB对照表、颜色选择器
redis实现分布式锁的原理
Ultra-detailed Asp.net uses SSL two-way authentication, one article is enough
MySQL_关于JSON数据的查询
LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之二:编码实现
Partition table (1)
深度学习之 10 卷积神经网络1
Oracle 迁移至Mysql
chrome F12 network 保留之前请求信息
Rabbit and Falcon are all covered, Go lang1.18 introductory and refined tutorial, from Bai Ding to Hongru, the whole platform (Sublime 4) Go lang development environment to build EP00
随机推荐
mysql 运行的时候 报错
迅为IMX6开发板QT系统创建AP热点基于RTL8723交叉编译hostapd
Mysql OCP 30题
响应式布局经典范例——巨幅背景大标题
bihash总结
ClickHouse删除数据之delete问题详解
2022.8.2-----leetcode.622
命令行加载特效 【cli-spinner.js】 实用教程
【LeetCode】老虎证券面试-括号嵌套且满足优先级
如何优雅的消除系统重复代码
MySQL的分页你还在使劲的limit?
【LeetCode】101. Symmetric Binary Tree
Index (3)
使用GBase 8c数据库的时候,遇到这种报错“[[email protected] ~]$ /home/gbase/script/gha_ctl install -p……
go中select语句
"Easy to use" websites that others don't know, make you more efficient
Apple Silicon配置二进制环境(二)
STP和RSTP的BPDU报文中flag位 对比+分析
MySQL-存储过程-函数-
索引(三)