当前位置:网站首页>按位取反怎么运算_按位取反运算
按位取反怎么运算_按位取反运算
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
边栏推荐
猜你喜欢
SQL exam questions
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 事务原理详解
二叉查找树的插入
命令行加载特效 【cli-spinner.js】 实用教程
MySQL 免安装版的下载与配置教程
When deleting a folder, the error "Error ox80070091: The directory is not empty" is reported. How to solve it?
深度学习之 10 卷积神经网络1
redis实现分布式锁的原理
响应式布局经典范例——巨幅背景大标题
随机推荐
Flink Yarn Per Job - 启动AM
oracle ASM磁盘空间的查看
R语言ggplot2可视化数据点重合的散点图、数据点有重合、使用geom_smooth函数基于lm方法拟合数据点之间的趋势关系曲线、自定义数据点的大小、色彩、添加主标题、副标题、题注信息
兔起鹘落全端涵盖,Go lang1.18入门精炼教程,由白丁入鸿儒,全平台(Sublime 4)Go lang开发环境搭建EP00
mysql 事务原理详解
For heavy two-dimensional arrays in PHP
验证浮点数输入
Network LSTM both short-term and long-term memory
scala减少,reduceLeft reduceRight,折叠,foldLeft foldRight
自动化测试浏览器驱动下载版本对应关系
WinCheck Script
函数指针数组
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
STP和RSTP的BPDU报文中flag位 对比+分析
Index (3)
MySQL-存储过程-函数-
pytorch installation error
罕见的数学天才,靠“假结婚”才得到追求事业的机会
Oracle 数据如何迁移到MySQL 图文详细教程
超详细的Asp.net使用SSL双向认证,一篇就够了