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

按位取反的概念和计算方法「建议收藏」读本文前请首先搞懂 “反码”,“取反”,“按位取反(~)”,这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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • jquery输入数字随机抽奖特效

    简介:jQuery自定义数值抽奖活动代码是一款点击开始按钮计算机会产生玩家输入范围内的随机数,点击停止按钮,将显示数字最终结果的效果。效果展示 http://hovertree.com/te

    2021年12月26日
    64
  • oppo手机锁屏断网怎么解除_oppo手机锁屏的时间怎么调整位置

    oppo手机锁屏断网怎么解除_oppo手机锁屏的时间怎么调整位置oppo手机是有很多种锁屏时钟的,手机在息屏状态下,即可以查看时间,还可以在屏幕上显示很多相关的信息,不过很多小伙伴想要更多的个性化锁屏界面,比如把锁屏时钟调个位置和样式等等。那么oppo锁屏时钟怎么改格式?锁屏时钟位置在哪里设置调整呢?下面小编就来详细讲一讲!oppo锁屏时钟怎么改格式?锁屏时钟位置在哪里设置调整一、先来看oppo锁屏时钟怎么改格式?1、第一找到桌面上的“设置”—“显示与亮度”—…

    2022年9月29日
    7
  • JavaScript语法学习(一文带你学会JavaScript)

    JavaScript语法学习(一文带你学会JavaScript)概述所有的代码必须写在<scripttype=“text/javascript”>当中。如果需要引用外部的js文件,格式为 <scripttype=“text/javascript”src=“XXXXX”></script>src为链接的外部地址 而此时所有的代码必须为外部文件,写在其中的代码无效。每一句js语句后面都要跟上分号为了语法规范,script标签应该写在head标签当中,且可以引入多个script标签表示不同功能块&lt;可以表示

    2025年11月10日
    6
  • 104规约总结「建议收藏」

    104规约总结「建议收藏」一.概念遥测:远程测量。采集并传送运行参数,包括各种电气量(线路上的电压、电流、功率等量值)和负荷潮流等。遥控:远程控制。接受并执行遥控命令,主要是分合闸,对远程的一些开关控制设备进行远程控制。遥信:远程信号。采集并传送各种保护告警和开关量信息。遥调:远程调节。接受并执行遥调命令,对远程的控制量设备进行远程调试,如调节发电机输出功率。二.基地址对比类别1997版基地址2002版基地址遥信1H—-400H1H—-4000H遥测701H–

    2022年6月20日
    71
  • python全局变量在整个程序内都有效_Python 全局变量使用

    python全局变量在整个程序内都有效_Python 全局变量使用在平时的开发中我们有时候会用到全局变量 但是很多开发语言不允许使用或者建议少使用全局变量 Python 也是如此 但是有时候为了编写程序的方便和灵活 必须使用全局变量 这篇文章记录是我在使用 Python 全局变量的一些体会 写的不是很好 欢迎大家指正 一 使用全局变量首先展示一段不能修改全局变量的代码 gl string helloPython 定义全局变量 gl stringprint i

    2025年8月6日
    2
  • 干货|手把手教你写一个串口调试助手「建议收藏」

    干货|手把手教你写一个串口调试助手「建议收藏」摘要:前段时间发布了一个用QT写的串口调试助手,很多小伙伴在后台留言要源码。其实网上有很多免费开源的用QT的上位机,大家搜一下就能找到,为了大家方便学习QT以及如何写一个上位机,今天推荐一下学习资源,顺带带大家写一个非常简单的串口调试助手。相信很多小伙伴还没有接触过QT,如果想用QT写一个调试助手,首先是会一点C++语法。了解即可,也就是看得懂C++的代码。只要能看懂简单的C+++语法,就能很快的写一个串口调试助手。先推荐两个视频教程,感兴趣可以看看!1、B站Jomse工看完你基本知道串口调试助手

    2022年5月9日
    88

发表回复

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

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