按位取反怎么运算_补码取反加一

按位取反怎么运算_补码取反加一读本文前请首先搞懂“反码”,“取反”,“按位取反(~)”,这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
  • 内存中存放格式 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.net/170458.html原文链接:https://javaforall.net

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


相关推荐

  • jvm内存泄漏

    jvm内存泄漏内存泄漏和内存溢出的关系内存泄露:指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收,它始终占用内存。即被分配的对象可达但已无用。内存溢出:指程序运行过程中无法申请到足够的内存而导致的一种错误。内存溢出通常发生于OLD段或Perm段垃圾回收后,仍然无内存空间容纳新的Java对象的情况。从定义上可以看出内存泄露是内存溢出的一种诱因,但是不是唯一因素。可以使用Runtime.ge…

    2022年5月6日
    47
  • mmap 内存映射详解

    mmap 内存映射详解mmap基础概念mmap是一种内存映射的方法,这一功能可以用在文件的处理上,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。在编程时可以使某个磁盘文件的内容看起来像是内存中的一个数组。如果文件由记录组成,而这些记录又能够用结构体来描述的话,可以通过访问结构数组来更新文件的内容。实现这样的映射关系后,进程就可以采用指针的方式读写操…

    2022年6月22日
    34
  • pytorch中的卷积操作详解

    pytorch中的卷积操作详解首先说下pytorch中的Tensor通道排列顺序是:[batch,channel,height,width]我们常用的卷积(Conv2d)在pytorch中对应的函数是:torch.nn.Conv2d(in_channels,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,bias=Tr…

    2022年5月28日
    52
  • 粒子群算法matlab代码(注释很详细哦,图像也美美哒,任意维度)[通俗易懂]

    粒子群算法matlab代码(注释很详细哦,图像也美美哒,任意维度)[通俗易懂]整个程序分为5个脚本pso1_mian.m:主程序,在此脚本内设置参数。pso1_im.m:画出函数图像(仅1维和2维)pso1_in.m:初始化pso1_in2.m:迭代寻优并输出结果另外还有一个目标函数,单独为一个脚本。推荐的测试函数—>这里先上运行结果图下面是源码1.pso1_mian.m这里的目标函数用函数句柄的形式调用(第15行)%%粒子群算法%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%pso1_im

    2022年5月1日
    72
  • filereaderror_InputStreamReader

    filereaderror_InputStreamReader今天梳理IO笔记时发现一个问题–FileReader是鸡肋吗,它有用吗???在使用字符流读取文本文件时(且不使用包装流时),有两种类提供读取文件方法,分别是InputStreamReader和FileReader,后者为前者子类。引言–当文本文件编码与编译工具默认编码不同时,FileReader类的方法读取文件会出现乱码的情况,这时需要用到转换流InputStreamReader的InputStreamReader(InputStreamin,StringcharsetName)方法。作为转换

    2022年9月25日
    0
  • js的api文档_响应式编程

    js的api文档_响应式编程Web3.jsAPI中文文档web3对象提供了所有方法。

    2022年8月6日
    5

发表回复

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

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