补码

python的取反运算

≯℡__Kan透↙ 提交于 2020-03-01 15:16:28
今天在看到Python的取反运算的时候,发现取反自己理解起来有点不正常 于是查询后了解如下: 比如一个数 3 ,它的二进制是 0000 0011,对其进行取反运算 ~3 得到的是 -4,这时候就有些蒙了,对3取反不应该是1111 1100吗? 其实在python中对一个数进行取反运算,得到的值(1111 1100)是我们要求的数的补码,现在问题变成了 一个数x的补码等于1111 1100 我们要求这个x,x的符号由左边第一位确定,如果为1则为负数,为0则为正数 求一个数的补码,是对这个数取反,再加一,得到原码,11111 1100的补码 0000 0011再加一,得到0000 0100也就是4,加上负号就是-4 来源: https://www.cnblogs.com/hztjiayou/p/9932205.html

补码一位乘法(Booth算法,C语言实现)

喜欢而已 提交于 2020-02-29 19:32:34
补码一位乘法 首先了解下什么是补码?   补码概念的理解,需要先从“模”的概念开始。 我们可以把模理解为一个容器的容量。当超出这个 容量时,会自动溢出。如:我们最常见到的时钟,其容量 是 12,过了 12 点之后,就会变为 1 点, 2 点……也就是 说,超过12的部分将被丢弃。那么,在这个例子当中,时钟 的模就是12。模的概念可以帮助我们理解补码的含义。   补码的引出:假设现在时钟的时针指向 4 点的位 置,要使其指向 3 点,可以怎么操作呢?很明显,共有 2 种方法,顺时针拨 11 格(+11),或逆时针拨 1 格(-1)。 (为了区分顺时针和逆时针,我们用正数表示顺时针方 向转动的距离,负数表示逆时针方向转动的距离) 从上面的例子,不难发现,+11 和-1 实现了同样的 作用。主要原因是时钟的模是 12,顺时针旋转代表加法 运算:4+11=15,而达到模的部分会自动溢出,即 15-12= 3,即到达 3 点的位置。逆时针旋转代表减法运算:4-1= 3。在这个例子当中,+11和-1 是完全等价的。也就是说, 负数-1 可以用正数+11 代替,这样就可以把减法运算改 为加法运算。也可以说:+11 就是-1 的补码(模为 12 的 情况下)。 具体 的补码一位乘法(B ooth算法)    Booth算法简介    Booth算法也就是补码1位乘的比较法。被乘数为[X]补,乘数为

位运算

妖精的绣舞 提交于 2020-02-29 00:47:03
首先 要明白位运算是在二进制中的运算方式,所有其他进制的数在进行位运算时都要先转化成二进制数再进行运算。 位运算主要包括按位与(&)、按位或(|)、按位异或(^)、取反( ~ )、左移(<<)、右移(>>)这几种。 其中除了取反( ~ )以外,其他的都是二目运算符,即要求运算符左右两侧均有一个运算量。 补码 补码是为了表示一个负数的二进制形式。 其转化方式是,先将负数当成正数,转化成二进制的形式,再将二进制正数的各个位上取反,再加上一。 例如-5 先求出5的二进制数 : 0000 0000 0101 然后将各个位上0变1,1变0 : 1111 1111 1010 最后再加1 : 1111 1111 1011 按位与(&) 运算的两个数,转换算为二进制后,进行与(&)运算。 当相应位上的数都是1时,该位取1,否则该为0。 例如5 & -5 5 : 0000 0000 0101 -5 :1111 1111 1011 答案 : 0000 0000 0001 按位或(|) 运算的两个数,转换为二进制后,进行或(|)运算。 只要相应位上存在1,那么该位就取1,如果都不为1,就为0。 还是5 | -5 0000 0000 0101 1111 1111 1011 可以看到每一位中其中一个都有1 答案 :1111 1111 1111 按位异或(^) 运算的两个数,转换成二进制数后,进行异或(^

二进制补码

余生颓废 提交于 2020-02-28 22:45:25
计算机系统中,数值一律用二进制的补码来存储 二进制的最高位是符号位,0表示正数,1表示负数 正数的值是其本身,负数的值是最高位即符号位不变,其他位取反,再加1 两数相加,若符号位有进位,则进位被舍弃。 来源: CSDN 作者: weixin_29210367 链接: https://blog.csdn.net/weixin_29210367/article/details/104564580

java位运算符

别说谁变了你拦得住时间么 提交于 2020-02-28 07:14:56
一、什么是位运算 位运算是对操作数以二进制为单位进行的操作和运算,运算结果为整数。计算机内部是用补码表示数,位运算是对数的补码进行运算,正数的补码等于原码,负数的补码等于其相反数的原码取反加1。 二、位运算符 1.&(按位与) 参与运算的数字,低位对齐,高位不足的补零,如果对应的二进制位同时为1,那么计算结果才为1,否则为0。因此,任何数与0按位与运算,其结果都为0。 2.|(按位或) 参与运算的数字,低位对齐,高位不足的补零。只要对应的二进制位有一个为1,那么结果就为1,否则为0。 3.^(按位异或) 参与运算的数字,低位对齐,高位不足补零,如果对应的二进制位相同,结果为0,否则结果为1。 4.~(按位取反) 只对一个操作数进行运算,将操作数二进制中的1改为0,0改为1. 因为在计算机中使用补码表示,最高位为1表示负数。补码求原码的方法是最高位符号不变,其余各位求反,再加1。 5.<<(左移位) 按二进制形式把所有的数字向左移动对应的位数,符号不变,高位移除(舍弃),低位补零。 6,>>(右移位) 按二进制形式把所有的数向右移动对应的位数,低位移出(舍弃),正数的高位的空位补0,负数的高位的空位补1. 7.>>>(无符号右移) 按二进制形式把所有的数字向右移动相对应的位数,低位移出(舍弃),高位的空位补零(无论正数负数都补零)。 来源: CSDN 作者: 久伴丶.丶 链接:

二进制中的原码反码补码

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-28 04:53:17
二进制中的原码、反码、补码 1. 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制: [+1] 原 = 0000 0001 [-1] 原 = 1000 0001 第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是: [1111 1111 , 0111 1111] 即 [-127 , 127] 原码是人脑最容易理解和计算的表示方式. 2. 反码 反码的表示方法是: 正数的反码是其本身 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反. [+1] = [00000001] 原 = [00000001] 反 [-1] = [10000001] 原 = [11111110] 反 可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算. 3. 补码 补码的表示方法是: 正数的补码就是其本身 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1) [+1] = [00000001] 原 = [00000001] 反 = [00000001] 补 [-1] = [10000001] 原 = [11111110] 反 = [11111111] 补 对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.

原码 反码 补码的概念

╄→гoц情女王★ 提交于 2020-02-28 04:18:16
1.真值和机器数:   一个十进制的数叫做 真值 ,它在计算机中存储的二进制形式的数叫做 机器数 。 2.真值数据的表示形式:   机器数有固定的位数,位数大小与计算机有关,通常为8位或者16位。以8位为例,最高位表示正负,0代表正,1代表负。例如10000011表示的数字是-3,最高位的1代表负号。 3.原码:   除了最高位的符号位外,其他7位是数值位即一个十进制数字的二进制表示方法。  例如: 符号位 0 1 1 1 1 1 1 1   表示的数字是:1*2^6+1*2^5+1*2^4+1*2^3+1*2^2+1*2^1+1*2^0=127 4.反码:   正数的反码与原码相同   符号位 0(原码) 1 1 1 1 1 1 1 符号位 0(反码) 1 1 1 1 1 1 1     负数的反码是除了符号位,其他位0变为1,1变为0; 符号位 1 (原码) 0 1 0 0 0 0 1 符号位1(反码) 1 0 1 1 1 1 0 5.补码:   正数的补码与原码相同 符号位 0(原码) 1 1 1 1 1 1 1 符号位0(补码) 1 1 1 1 1 1 1   负数的补码是在其反码的最低位加1。其他位满足满2进1的计算原则 符号位 1(原码) 0 1 0 0 0 0 0 符号位 1(反码) 1 0 1 1 1 1 1 符号位 1(补码) 1 1 0 0 0 0 0 6

原码,补码,反码

会有一股神秘感。 提交于 2020-02-28 04:17:12
一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。 那么,这里的 00000011 和 10000011 就是机器数。 2、真值 因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。 例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1。 二. 原码, 反码, 补码的基础概念和计算方法. 在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式. 1. 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值,正数的符号位为0,负数的符号位为1, 比如如果是8位二进制: [

理解有符号数和无符号数

陌路散爱 提交于 2020-02-28 04:10:10
http://www.cnblogs.com/lazycoding/archive/2011/03/21/unsigned-signed.html 声明网上看到的文章,原文找不到了,原文被转载的不成样子,重复很多,整理花了很长时间,在翻看了维基百科后发现,原文中对于负数原码和补码存在一些问题,修改了一部分,原作者看到后可以联系我。 1、你自已决定是否需要有正负。 就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负。如果这个量不会有负值,那么我们可以定它为带正负的类型。 在计算机中,可以区分正负的类型,称为有符类型(signed),无正负的类型(只有正值),称为无符类型。 (unsigned)数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有符类型。 字符类型也分为有符和无符类型。 比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型。 2、使用二制数中的最高位表示正负。 首先得知道最高位是哪一位?1个字节的类型,如字符类型,最高位是第7位,2个字节的数,最高位是第15位,4个字节的数,最高位是第31位。不同长度的数值类型,其最高位也就不同,但总是最左边的那位(如下示意)。字符类型固定是1个字节,所以最高位总是第7位。 (红色为最高位) 单字节数: 11111111 双字节数: