当前位置:网站首页>按位取反怎么运算_按位取反运算
按位取反怎么运算_按位取反运算
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
边栏推荐
- Mysql OCP 27题
- Does setting the following sysctl settings require a system reboot?
- 二叉查找树的综合应用
- Mysql OCP 28题
- go中select语句
- MySQL8重置root账户密码图文教程
- 2022年起重机械指挥培训试题模拟考试平台操作
- mysqldump导出提示:mysqldump [Warning] Using a password on the command line interface can be insecure
- Mysql OCP 29题
- The simplest base64 image stream in js realizes automatic download
猜你喜欢
随机推荐
响应式布局经典范例——巨幅背景大标题
STP普通生成树安全特性— bpduguard特性 + bpdufilter特性 + guard root 特性 III loopguard技术( 详解+配置)
【LeetCode】112. Path sum
【LeetCode】老虎证券面试-括号嵌套且满足优先级
固件工程师到底是干什么?
015-Balanced binary tree (1)
rpm文件解包提取 cpio
STP和RSTP的BPDU报文中flag位 对比+分析
深度学习之 10 卷积神经网络1
SQL Daily Practice (Nioke New Question Bank) - Day 5: Advanced Query
ImportError: DLL load failed with error code -1073741795
Mysql OCP 26题
如何优雅的消除系统重复代码
2022.8.2-----leetcode.622
Flink Yarn Per Job - Submit application
Let‘s Encrypt 使用
机器学习(公式推导与代码实现)--sklearn机器学习库
Promise 1: Basic Questions
WinCheck Script
cmd(命令行)操作或连接mysql数据库,以及创建数据库与表