关于非二进制的补码与反码

关于名称

补码应该叫Diminished Radix Complement,而反码则是Radix Complement。最常见的所谓1‘s complement与2‘s complement其实是是相对于2进制而言。

也就是说,对于2进制,Diminished Radix Complement可称1‘s complement,Radix Complement可称2‘s complement。那么对于8进制,Diminished Radix Complement应称作7‘s complement而Radix Complement则为8‘s complement。

注意,2‘s complement这个名字对于2进制指的是补码,而对于3进制就是反码了,以此类推。

计算方法

Diminished Radix Complement的算法

  设位数为n,需要计算的数字为N,属于r进制,则其反码((r-1)‘s complement)为
  (rn – 1) – N
计算时,rn-1用同样的进制表示比较方便,比如三位的10进制105-1就是99999,8进制的85-1就是(77777)8

比如
  (AA)16的反码(15‘s complement)是(FF)16 - (AA)16 = (55)16
  (546700)10的反码(9‘s complement)是(999999)10 – (546700)10 = (453299)10
  (017)8的反码(7‘s complement)是(777)8 - (017)8 = (760)8
  (1011000)2的反码(1‘s complement)是(1111111)2 - (1011000)2 = (0100111)2

这意味着一个数加上自己的反码得到的是rn-1,也就是10进制的99999,8进制的(77777)8这样

Radix Complement的算法

  都和2进制的2‘s complement一样,Radix Complement=Diminished Radix Complement + 1
  或者说是(rn – 1) – N + 1,简化一下就是rn – N,不过用前者借位一般比较少(试想999-621与1000-621,哪个好算?),更加方便。

  (AA)16的补码(16‘s complement)是(FF)16 - (AA)16 + 1 = (56)16
  (546700)10的补码(10‘s complement)是(999999)10 – (546700)10 + 1= (453300)10
  (017)8的补码(8‘s complement)是(777)8 - (017)8 + 1 = (761)8
  (1011000)2的补码(2‘s complement)是(1111111)2 - (1011000)2 + 1 = (0101000)2

这意味着一个数加上自己的补码得到的是rn,也就是一个1跟着一堆0,比如10进制的100000,8进制的(10000)8之类。

参考资料:http://www2.southeastern.edu/Academics/Faculty/galkadi/297/notes/chapter1.doc(应当来自于M.Morris.Mano的一本书)

时间: 2024-11-06 03:34:08

关于非二进制的补码与反码的相关文章

java变量、二进制、数据类型、方法、原码、补码、反码

1. 变量  1. 他 她 我 你 某人 佚名 旺财 X-man x = 1     您好! 它    (变量就是自然语言中的代词)  2. int age = 15;// 00000000 00000000 00000000 00001111   3. Java 中的变量     a Java是强类型语言,     b 变量必须声明,并且初始化以后使用     c 变量必须有明确的类型     d 变量不能重复定义  4. 变量的作用域     a 在声明的地方开始,到块结束为止     b

二进制的原码补码和反码

二进制的最高位为符号位,其中0表示正数,1表示负数: 正数的原码补码反码都是相同的: 负数的反码是负数的符号位不变,其余位取反(即1变0,0变1): 负数的补码是反码加1: 举例:计算机字长为八位,所以转换一下, 正一的原码:0000 0001 反码:0000 0001 补码:0000 0001 (均相同) 负一的原码:1000 0001(最高位的1表示为负数) 反码:1111 1110(最高位的符号位不变,其余取反) 补码:1111 1111(反码加一) 原文地址:https://www.cn

OC成长之路 <一> 位运算符、枚举、(原码,补码,反码)、以及NSInteger,NSUInteger,int的区别

引言: 咳咳,首先我是一枚资深小白(资深小白- -.也太衰),这个博客是自己用来记录迷糊犯二的东西. 最近发现难道是因为老了么(我明明18....),很多东西,脑子已经不记得了,迷迷糊糊,概念理论的东西脑子里面七零八落. 从一个知识点跳到另一个知识点,简直是连环事故. ??sad. 傲娇的我不服,决心要认认真真做好笔记,记录期间遇见的种种. 生活要有仪式感,学习应该也是要这样,作为Chapter 1 ,应该要起个好名字. 想了几十分钟,还是随便一些吧. 那就叫: OC成长之路 okok,来开始今

原码,补码,反码

原码,补码,反码,这东西在我刚开始学习java的时候困扰了我好一会,看书本上的说法总感觉缺点什么 究其因归结为一个问题:1000 0101为什么不是-5? 1) 后来查了资料,自己梳理了下,理清楚了,在计算机中,系统统一使用补码来表示和存储,原因在于通过这种规则可以将符号位参与逻辑运算,于是有了以下两条规则 ① 正数: 补码 = 反码 = 原码 ② 负数: 补码 = 反码 + 1, 反码 = 该负数对应的正数原码最高位取1 2) 下面主要说明负数的补码换算过程,就以-5为例: ① 5的原码000

原码、补码、反码和移码

在计算机中所有的数据的保存均是用二进制来实现的,而二进制的表示则是一串的0,1组成.而在计算机的表达中有着机器数和原码,反码,补码和移码等数据的编码表示方法.其中这些编码的方法称为码制. 一.机器数 各种数据在计算机中的表示的形式称为机器数,其特点是数的符号用0.1来表示.机器数并不能算作真正的数值. 二.真值 机器数对于的实际数值称为该数的真值.也就是带符号的机器数(机器数是不带符号位的):机器数又分为无符号数和有符号数两种.无符号数表示正数,在机器数中没有符号位.对于带符号数,机器数的最高位

C语言中的补码与反码(-1的十六进制ffffffff)

我们先举个例子 1个字节的数字7用二进制表示为  0000 0111,最高位为0(0为正数,1为负数) 反码是将正数的所有位都取反,包括最高位 而负数的二进制表示为补码(反码加1),反码只是过渡阶段 -7   我们由+7来推倒 +7  0000 0111 ==>1111 1000 ==>1111 1001 +7二进制              反码               -7二进制(补码),最高位为1 例题:-1的十六进制是多少? 答:1   0000 0001 ==> f f f

c++位运算符 | & ^ ~ && ||,补码,反码

一:简介 1 位逻辑运算符: & (位   "与")  and ^  (位   "异或")   |   (位    "或")   or   ~  (位   "取反") 2 移位运算符: <<(左移) >>(右移) 优先级 位"与".位"或"和位"异或"运算符都是双目运算符,其结合性都是从左向右的,优先级高于逻辑运算符,低于比较运算符,且

计算机原码、补码、反码与java移位运算符(&lt;&lt;/&gt;&gt;/&gt;&gt;&gt;)

一.机器值和真值 1.机器值 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011.如果是 -3 ,就是 10000011 . 那么,这里的 00000011 和 10000011 就是机器数. 2.真值 因为第一位是符号位,所以机器数的形式值就不等于真正的数值.例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3

补码与反码

补码 与反码 计算机中一般采用补码的形式来简化减法运算和逻辑运算.在电路功能实现是,简化减法运算可以减少多余的电路,降低了复杂度.每个进制系统都有两种类型的补码:基数补码和基数减1补码(基数反码). 1.基数反码 定义:对于一个数字:有n位,且进制是r,的数字是N,其反码的定义是(rn -1)-N :例如对于546700的反码的运算就是 106-1 =999999: 999999-546700=453299: 二进制的反码 :对于10001 Rn-1即10000-1=1111 1111-1000