按位取反的概念和计算方法「建议收藏」

按位取反的概念和计算方法「建议收藏」读本文前请首先搞懂 “反码”,“取反”,“按位取反(~)”,这3个概念是不一样的。取反:0变1,1变0反码:正数的反码是其本身,对于负数其符号位不变其它各位取反(0变1,1变0)按位取反(~):这将是下面要讨论的。“~”运算符在c、c++、java、c#中都有,之前一直没有遇到这个运算符。要弄懂这个运算符的计算方法,首先必须明白二进制数在内存中的存放形式,二进制数在内存中是以补码的形式存放的。…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

读本文前请首先搞懂  “反码”,“取反”,“按位取反(~)”,这3个概念是不一样的。

取反:0变1,1变0

反码:正数的反码是其本身,对于负数其符号位不变其它各位取反(0变1,1变0)

按位取反(~): 这将是下面要讨论的。

“~”运算符在c、c++、java、c#中都有,之前一直没有遇到这个运算符。

要弄懂这个运算符的计算方法,首先必须明白二进制数在内存中的存放形式,二进制数在内存中是以补码的形式存放的。

另外正数和负数的补码不一样,正数的补码、反码都是其本身,既:

正数9:

原码为: 0000 1001

补码为: 0000 1001

反码为: 0000 1001


再例如: -2 

求原码: 1111 0010 (前面4个1表示符号位)

求反码: 1111 1101 (符号位不变,其余各位求反)

求补码: 1111 1110 (符号位不变,末位+1)

所以-2在内存中存放为: 1111 1110

————————————————————————————————-

弄懂了上述情况后,如何计算就好办了

假设要对正数9按位取反——> (~9),计算步骤如下,

原码为 0000 1001,

反码为 0000 1001,

补码为 0000 1001,

对其取反 1111 0110(符号位一起进行取反,这不是反码更加不是最终结果,只是补码的取反仅此而已

我们还需要把他转换成原码,因为是负数所以进行负数补码到原码的逆运算

先减1得反码: 1111 0101

取反得原码:1111 1010,(反码和原码是一个相对的概念,对反码取反就是原码。取反过程符号位是不变的哦)

前面4个1是符号位,1是负数,既得十进制:-10

不知道说的明不明白,这里步骤就是:

1. 先对正数求补码

2. 然后对补码取反,包括符号位

3. 最后进行一个补码求原码的过程,一定要搞清概念啊。


————————————————————————————————-

下面我们再反推计算 (~ -10)

-10的原码:1111 1010 

-10的反码:1111 0101 (符号位不变)

-10的补码:1111 0110 (符号位不变,末位+1)

补码取反:0000 1001 (符号位一起取反)

这是一个正数,那么我们对其求原码就可得到最终结果?

因为正数的补码,反码,原码都是一样的 那我们的最终结果是 0000 1001 ,十进制是 9,这与我们前面推算出的结果吻合。


————————————————————————————————-

最后一个有趣的事实是:

1. 所有正整数的按位取反是其本身+1的负数

2. 所有负整数的按位取反是其本身+1的绝对值

3. 零的按位取反是 -1(0在数学界既不是正数也不是负数) 

  1. // 测试-1亿 到 1亿的所有整数  :)  
  2. for (int i = 0; i <= 100000000;++i)  
  3. {  
  4.     if (~i != -(i+1) )  
  5.     {  
  6.         __asm { cli }           // 汇编中断指令  
  7.     }  
  8.   
  9.     if (i && ~(-i) != abs((-i)+1) )  
  10.     {  
  11.         __asm { cli }  
  12.     }  
  13. }  


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(1)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一个低级的ORA-01017错误

    一个低级的ORA-01017错误事件缘由:使用sys账户创建了一个数据清理的存储过程,再创建一个Oraclejob定时运行这个存储过程,用于做表数据的清理。第二天看表数据未删除,说明job执行有错,打算使用sys账号登录查看job运行情况,反复输入sys账户信息,总提示ORA-01017,1.尝试改sys用户密码,重试报错依旧。2.使用sys登录GC,报错相同。使用普通用户登录正常。3.数据库服务器上使用sq

    2022年6月1日
    36
  • ASMM

    ASMMSGA_MAX_SIZE:staticparameterTouseASMM,needtwoparameters:1.SGA_TARGETnotnullorzero;2.STATISTICS_L…

    2022年6月8日
    76
  • Generic Host Process for Win32 Services 错误

    Generic Host Process for Win32 Services 错误机器运行时防火墙一直提示“GenericHostProcessforWin32Services”访问网络,选阻止后系统就一直弹出一个GenericHostProcessforWin32Services遇到问题需要关闭的对话框!在资源管理器中把系统文件的隐藏属性打开后,发现每个盘的根目录下和C:/WINDOWS目录下都有一个gg.exe文件,每个盘的根目录下有一个autoru

    2022年10月12日
    3
  • Python学习(一)-环境搭建之PyCharm专业版激活成功教程

    Python学习(一)-环境搭建之PyCharm专业版激活成功教程PyCharm专业版激活成功教程1、下载地址:https://www.jetbrains.com/pycharm/download/#section=windows2、直接运行下载好的3、选择安装路径:E:\Pycharm\PyCharm2018.2.44、根据电脑配置打钩5、Install安装,安装后不打开软件6、将C:\Windows\System32\dri…

    2022年8月27日
    4
  • unit在matlab中啥意思,unit8(matlab中uint8函数)

    unit在matlab中啥意思,unit8(matlab中uint8函数)就是宏定义,代码中就用这些去定义变量如uint16a;就表示定义了一个无符号整形变量a(等价于unsignedinta;)其他的同理其作用是程序更加简洁最大的作用是增.将变量t类型强制转换为uint8*类型也就是转换成指向uint8类型变量的指针变量uint8应该是无符号8位二进制整型,其实就是unsignedchar类型。一定要是新教材!!!美国的复感恩节。在大多…

    2025年12月14日
    3
  • 高效工作指南

    高效工作指南

    2021年9月9日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号