补码

python核心编程:七分钟全面了解位运算

醉酒当歌 提交于 2020-02-03 04:05:44
位运算是我们在编程中常会遇到的操作,但仍然有很多开发者并不了解位运算,这就导致在遇到位运算时会“打退堂鼓”。实际上,位运算并没有那么复杂,只要我们了解其运算基础和运算符的运算规则,就能够掌握位运算的知识。接下来,我们一起学习位运算的相关知识 文章目录 位运算的基础 二进制 补码 按位与 按位取反 左移运算 右移运算 位运算的应用 判断数字奇偶 变量交换 取 x 的第 k 位 代替地板除 程序中的数在计算机内存中都是以二进制的形式存在的,位运算就是直接对整数在内存中对应的二进制位进行操作。 位运算的基础 我们常用的 3, 5 等数字是十进制表示,而位运算的基础是二进制。即人类采用十进制,机器采用的是二进制,要深入了解位运算,就需要了解十进制和二进制的转换方法和对应关系。 二进制 十进制转二进制时,采用“除 2 取余,逆序排列”法: 用 2 整除十进制数,得到商和余数; 再用 2 整除商,得到新的商和余数; 重复第 1 和第 2 步,直到商为 0; 将先得到的余数作为二进制数的高位,后得到的余数作为二进制数的低位,依次排序; 排序结果就是该十进制数的二进制表示。例如十进制数 101 转换为二进制数的计算过程如下: 逆序排列即二进制中的从高位到低位排序,得到 7 位二进制数为 1100101,如果要转换为 8 位二进制数,就需要在最高位补 0。即十进制数的 8 位二进制数为

谈谈补码与移位

我们两清 提交于 2020-02-02 13:43:34
在计算机中整数的表示使用补码来表示的。 什么是补码呢?首先要明白什么是原码。 数字是有符号的,计算机中,用最高位作为符号位。以四位机器码举例:1的原码表示是:0001; -1 的原码表示是:1001。 也就是说表示实际数值的只有3位。因此4位机器码原码表示数的范围是:[-7, 7],其中0有两种表示,+0: 0000; -0: 1000。 原码表示清晰易懂,但对机器来说却是个麻烦,因为我们必须设计两套电路分别表示加法和减法。 为了统一加减法电路,人们想到了同余原理,让符号位也参与运算,补码应运而生。(反码没有实际应用,没必要记,这里就不解释了,实际上如果不是为了引出正数的补码表示,原码也没必要记) 对于正数,补码表示就是其原码,还以四位机器码举例:1的补码表示是:0001。 对于负数,补码表示就是对于相应的正数表示,连同符号位一起,各位取反后加1。 -1的补码表示为: 1111。(0001 各位取反,1110, 再加1) 对于补码来说,我们没办法直接看出负数的值,想知道负数的真值,我们需要对负数求补,再加上符号位即可。 以-3举例:1101。最高位是1,我们知道它是个负数。对其求补:0010 + 1 = 0011。我们也就知道了其值为-3。 也就是说,正数求补就是其对应的负数,负数求补就是其对应的正数。 对于减法,加上其负数的补码即可。我们成功的把减法运算变成为了加法运算。

原码反码补码移码

江枫思渺然 提交于 2020-02-02 13:42:31
原码:第一位是符号位,0正1负;其他位为二进制表示 反码:第一位是符号位,0正1负;若为负数,其他位为原码取反 补码:原码除符号位各位取反加1或反码末尾加1 移码:n为机器字长,2的n-1次方为移码的偏移量,例[+45]=+0101101+10000000, [-45]=-0101101+10000000=01010011。补码符号位取反即移码 小数表示亦同 ,其中〔-1〕补=2+(-1)=10.00···0+(-1.00···0)=1.00···0 算术移位:左移若不溢出相当于乘2,右移若不考虑舍去末位,相当于除2   正数:均在空位补0   负数:原码补0;反码补1;补码左移补0右移补1(左邻右1) 逻辑移位:一律添0 四则运算:   原码:减法,减数符号位取反,再进行加法计算   补码:加法减法,符号位一起参加运算,符号位的进位丢掉,结果的符号位由运算得出 溢出判断(补码):   单符号位:参加操作的两个符号位相同,结果若与原操作数不同则溢出   双符号位:又称模4补码。设AB位两个符号位AB=00 结果正,无溢出 =11结果负无溢出 01正溢出 10负溢出 乘除运算未完待续 来源: https://www.cnblogs.com/psymacome/p/8003983.html

原码,反码,补码

眉间皱痕 提交于 2020-02-02 13:42:17
计算机可以有三种编码方式表示一个数。对于正数因为三种编码方式的结果都相同 出于计算方便的原因需要有反码、补码的存在 原码 第一位表示符号, 其余位表示值 8位二进制 [+1]原 = 0000 0001 [-1]原 = 1000 0001 范围为: [1111 1111 , 0111 1111] => [-127 , 127] 反码 正数的反码是其本身 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反. [+1] = [00000001]原 = [00000001]反 [-1] = [10000001]原 = [11111110]反 补码 正数的补码就是其本身 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (反码加一) [+1] = [00000001]原 = [00000001]反 = [00000001]补 [-1] = [10000001]原 = [11111110]反 = [11111111]补 机器可以只有加法而没有减法 1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原 参考: 为什么要用补码 来源: https://www.cnblogs.com/xiaoniuzai/p

为什么要用补码,反码

ε祈祈猫儿з 提交于 2020-02-02 13:41:59
二. 原码, 反码, 补码的基础概念和计算方法. 在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式. 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]

为什么要用补码

◇◆丶佛笑我妖孽 提交于 2020-02-02 13:41:45
二. 原码, 反码, 补码的基础概念和计算方法. 在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式. 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]

C语言的原码,反码,补码

无人久伴 提交于 2020-02-02 13:41:13
1)原码表示 原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示。设有一数为x,则原码表示可记作[x]原。 例如,X1= +1010110 X2= 一1001010 其原码记作: [X1]原=[+1010110]原=01010110 [X2]原=[-1001010]原=11001010 在原码表示法中,对0有两种表示形式: [+0]原=00000000 [-0] 原=10000000 2)补码表示 机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。设有一数X,则X的补码表示记作[X]补。 例如,[X1]=+1010110 [X2]= 一1001010 [X1]原=01010110 [X1]补=01010110 即 [X1]原=[X1]补=01010110 [X2] 原= 11001010 [X2] 补=10110101+1=10110110 (3)反码表示法 机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。设有一数X,则X的反码表示记作[X]反。 例如:X1= +1010110 X2= 一1001010 [X1]原

霍夫曼编码的应用——压缩数据

我怕爱的太早我们不能终老 提交于 2020-02-01 21:34:21
霍夫曼编码的应用——压缩文件 二进制的补码,反码,以及原码之间的关系 原码:正数的原码:按照二进制转换成二进制码就是原码。负数的原码:其对应的绝对值转换成二进制原码后,在高位补一。 int类型的1,在32位机器上,占有的四个字节,高位补零。得到:00000000 00000000 00000000 00000001 int类型的-1,在32位机器上,占有四个字节,取绝对值,高位补一。得到:10000000 00000000 00000000 00000001 反码:正数的反码就是原码,负数的反码是原码除符号位以外所有的位取反。 int类型的1,在32位机器上,其反码为原码,高位补零。得到:00000000 00000000 00000000 00000001 int类型的-1,在32位机器上,其反码为符号位不变,其余取反。得到:11111111 11111111 11111111 11111110 补码:正数的补码与原码相同,负数的补码为在反码的基础上在最低位再加1 int类型的1,补码,反码,与源码相同。补码为:00000000 00000000 00000000 00000001 int类型的-1,在反码的基础上,与最低位加一。补码为:11111111 11111111 11111111 11111111 总结: 正数,三个码相同,原码,反码,和补码相同。 负数:

运算符

故事扮演 提交于 2020-01-31 08:24:46
一、算术运算符 +、-、*、/、%、++、-- 共7个。 int x = 30 ; int y = 18 ; // 30 - 17 + 17 / 2 + 32 - 31 int z = x ++ - -- y + y ++ / 2 + ++ x - -- x ; System . out . println ( x ) ; //31 System . out . println ( y ) ; //18 System . out . println ( z ) ; //22 对于更复杂的运算应该使用Math类。 二、赋值运算符 = 拓展的赋值运算符:+=、-=、*=、/= 三、比较运算符 <、<=、>、>=、==、!= 比较运算符用于比较连个变量或两个值,如果符合预期得到true,否则得到false。 四、逻辑运算符 只能对boolean值进行运算。 && :与。两个条件同时为true,结果为true。 & :不短路与。 || :或。任一条件为true,结果为true。 | :不短路或。 ^ :异或。两个条件相同,同为true或同为false,结果为true。 ! :非。 &&与&的区别 &&:如果第一个操作数已经是false,&&运算符不会计算第二个操作数,称之为短路。 &:如果第一个操作数已经是false,&运算符依然会计算第二个操作数,称之为不短路。 ||与|的区别: ||

每日一题总结 2020.01.26-2020.02.04

谁说胖子不能爱 提交于 2020-01-26 18:12:56
“>>”(有符号)右移,如果为正,高位补”0“; ----------------------------- 如果为负,高位补”1“。 ”>>>“ 无符号右移/逻辑右移,无论正负都补"0" 。(不管原数的符号位,就是把32位数右移,最后高位补"0") 没有无符号左移。Java中int类型是4字节, 32位 ,所以左移时要注意。(不是看当前数字有几位)。负数是以补码形式存储的,所以负数的左移和右移要先看补码左右移的结果, 然后根据”补码的补码是原码“求得最终结果。 (要注意求反码时: 符号位不变 ,其他位取反。) 比如:-10<<2:(加粗的"1"是符号位) -10的原码是000…0(27个0) 1 1010 , ------------------------------------------------------ 反码是111…1(27个1) 1 0101, ----------------------------- ------------------------ 补码 是111…1(27个1) 1 0110, 将补码左移2位的结果是: --------------------------------------------------------------- 111…1(25个1) 1 011000 接下来需要对补码求补码得到最终结果: ----------------