为什么这个补码捷径有效?

2024-03-06

形成二进制数的补码的一种捷径方法是从右侧复制位,直到复制了一位,然后对剩余位求补(反转)。

这在SO上有解释here https://stackoverflow.com/questions/33592801/converting-binary-to-negative-binary/33593355#33593355还有关于维基百科 https://en.wikipedia.org/wiki/Two's_complement#Converting_to_two.27s_complement_representation.

What is not解释了为什么这个快捷方式有效,也就是说,为什么它产生与反转所有位并加 1 相同的结果。所以,我的问题是,为什么这有效?


它之所以有效,是因为二进制数加一是通过从右侧将所有 1 翻转为 0 直到达到 0,将其翻转为 1 并停止(本质上是携带 1 与 1 相加的溢出)来完成的。

因此,一种方法仅翻转第一个位左侧的位,而另一种方法则翻转all位,然后将第一个 1(现在为 0)及其右侧的位翻转回来。

e.g.:

 01000100
 10111100  // copy bits until a 1 is reached, then flip the rest

vs

 01000100
 10111011  // invert all bits:
+       1  // add one
 10111100
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么这个补码捷径有效? 的相关文章

  • Python 中的“按位非”不考虑 2 的补码

    我需要在Python中执行 操作 但不考虑2的补码 我设法通过使用来做到这一点XOR 你知道另一种方法吗 更高效 a 0b101 b 0b10101 print bin a 2 a bit length 1 0b10 print bin b
  • 计算十六进制字符串的二进制补码校验和

    我有一个字符串 0AAE0000463130004144430000 我需要计算组成该字符串的十六进制字节的二进制补码校验和 上面示例字符串的公式为 对值求和 0A AE 00 00 46 31 30 00 41 44 43 00 00 2
  • 用 5 位二进制补码表示有符号数的最高和最低整数是多少?

    我了解二进制的工作原理 并且可以将二进制计算为十进制 但我对带符号的数字感到困惑 我找到了一个计算器进行转换 但我不确定如何找到最大值和最小值 或者在未给出二进制数的情况下进行转换 并且 StackO 中的问题似乎是关于转换特定数字或不包括
  • 符号扩展 1 位 2 的补数?

    我是一名学生 正在用 C 语言编写一个函数来对给定的位字段进行符号扩展 我正在使用 32 位 我在谷歌上查找了这个答案 但没有找到我想要的东西 我正在编写一个函数 该函数返回从 32 英寸中提取的一个或多个连续位的二进制补码表示形式 最左边
  • 5位数字可以表示的最大值和最小值是多少?以2的补码表示

    假设 2 的补码表示形式的 5 位数字可以表示的最大值和最小值是多少 我是否找到 5 位数字的最小值和最大值 即 00000 但我不确定最大值是多少 然后转换为二进制补码 这听起来很愚蠢 但这是我唯一能想到的 我的最后一个问题是 处理器中存
  • sra(算术右移)与 srl(逻辑右移)

    请看一下这两段伪汇编代码 1 li t0 53 sll t1 t0 2 srl t2 t0 2 sra t3 t0 2 print t1 print t2 print t3 2 li t0 53 sll t1 t0 2 srl t2 t0
  • 带 2 补码的二进制减法

    我需要帮助使用 2 的表示形式进行二进制减法 并为每个数字使用 5 位 1 9 7 有溢出吗 9 01001 2 的补码 10111 和 7 00111 2 的补码 11001 现在我们需要添加 因为我们使用的是 2 的补码 10111 1
  • 二进制补码转换

    我需要将二进制补码格式的字节转换为正整数字节 范围 128 到 127 映射到 0 到 255 Examples 128 10000000 gt 0 127 01111111 gt 255 etc EDIT为了消除混淆 输入字节 当然 是
  • Java 中的 String.format() 和十六进制数字

    我试图找出原因String format 正在按照它的方式行事 背景 系统编程课 编写汇编程序 目标文件中有一个 5 个字符的十六进制字段 我是根据一个值创建的 尝试使用 String format 05X decInt 这适用于正数 11
  • 结构变量不会因赋值而改变

    struct st int a1 3 int a2 2 int a3 1 void main void x a3 1 if x a3 1 printf TRUE n else printf FALSE n x a3 1 if x a3 1
  • 什么是“补码”?

    我正在学习计算机系统课程并且已经挣扎 部分地 与二进制补码 http en wikipedia org wiki Two 27s complement 我想理解它 但我读过的所有内容都没有为我提供完整的图片 我读过维基百科文章 http e
  • 将带符号的十进制转换为使用二进制补码编码的十六进制

    我需要编码signed通过二进制补码表示法将整数表示为十六进制 例如我想转换 e g 24375 to 0xffffa0c9 到目前为止 我一直在以下几方面开展工作 parseInt 24375 toString 2 gt 10111110
  • 仅使用按位函数求出表示 2 的补码需要多少位

    我们可以假设 int 是 2 的补码的 32 位 唯一合法的运营商是 gt 此时我正在使用暴力 int a 0x01 x x 1 gt gt 1 have tried with just x instead of x 1 as well a
  • 左移 1 次 31 (1 << 31) 如何获得最大 int 值?以下是我的想法和网上找到的一些解释

    我对位操作相当陌生 我正在尝试弄清楚 1 首先我知道 1 1000000000000000000000000000 我知道它实际上是最小 int 值的补集 但是当我试图算出 1 1000000000000000000000000000000
  • 为什么这个补码捷径有效?

    形成二进制数的补码的一种捷径方法是从右侧复制位 直到复制了一位 然后对剩余位求补 反转 这在SO上有解释here https stackoverflow com questions 33592801 converting binary to
  • C - 转换为 2 补码

    我决定这样做 翻转数字 0 1 1 0 LSB 加 1 如果进位 则循环直到 array i 0 但我坚持最后一点 我怎么能在条件循环中这么说呢 您正在谈论扩展算术 大多数处理器都有每次加法运算的进位和溢出结果 但 C 不提供对它们的访问
  • java中2的十六进制数到十进制的补码

    我有一个表示 2 的补码数的十六进制字符串 有没有一种简单的方法 库 函数 可以将十六进制转换为十进制而不直接使用其位 例如 这是左边十六进制的预期输出 0000 gt 0 7FFF gt 32767 max positive number
  • 处理负整数的汇编 MASM

    我被指示用汇编语言编写一个程序 该程序将执行以下算术 A B C D A E 当没有负值发挥作用时 我成功地做到了这一点 但假设 A 5 B 4 C 3 D 2 和 E 1 这给了我们 5 4 3 2 5 1 或 6 这就是我需要帮助的地方
  • std::hex 输入格式是否可以支持带有二进制补码表示法的负 int16_t 十六进制字符串,例如“ffff”代表“-1”?

    我想输入一个文本字符串ffff to a int16 t 该值应该是 1 这是一个简单的测试 C 程序 include
  • 按位非运算符

    为什么要按位运算 0 打印 1 在二进制中 不是0应该是1 为什么 你实际上很接近 在二进制中 不是0应该是1 是的 当我们谈论一位时 这是绝对正确的 然而 一个int其值为0的实际上是32位全零 将所有 32 个 0 反转为 32 个 1

随机推荐