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

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 英寸中提取的一个或多个连续位的二进制补码表示形式 最左边
  • 我们是否忽略补码的溢出

    我试图解决二进制补码内的溢出问题 例如说我试图去掉这两个二进制数 1111 1000 0100 010 111 001 000 我将第二个二进制数转换为两个补码等值 然后简单地将其相加 但我注意到它导致了 1 的溢出 我是否只是忽略溢出 或
  • 5位数字可以表示的最大值和最小值是多少?以2的补码表示

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

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

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

    我需要编码signed通过二进制补码表示法将整数表示为十六进制 例如我想转换 e g 24375 to 0xffffa0c9 到目前为止 我一直在以下几方面开展工作 parseInt 24375 toString 2 gt 10111110
  • 如果只需要结果的低位部分,可以使用哪种 2 的补码整数运算而无需将输入中的高位清零?

    在汇编编程中 想要从寄存器的低位计算某些内容是相当常见的 但不能保证其他位清零 在 C 等高级语言中 您只需将输入转换为小尺寸 然后让编译器决定是否需要分别将每个输入的高位清零 或者是否可以在事实 This is especially co
  • 仅使用按位函数求出表示 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
  • 为什么 2 的补码符号扩展通过添加符号位的副本来工作?

    我们以将 16 位有符号数符号扩展为 32 位寄存器为例 例如mov 5 ax movswl ax ebx 有两种可能的情况 高位为零 数字为正 这是非常容易理解和直观的 例如 如果我有号码5 左填充零非常容易理解 例如 00000000
  • 为什么这个补码捷径有效?

    形成二进制数的补码的一种捷径方法是从右侧复制位 直到复制了一位 然后对剩余位求补 反转 这在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
  • 为什么 -INT_MIN = INT_MIN 在有符号的二进制补码表示中?

    我仍然没有找到为什么最低的有符号负数没有等效的有符号正数的原因 为简单起见 我的意思是 3 位二进制数 100 是 4 但我们不能有符号格式的正 4 因为我们不能 它溢出了 那么我们如何知道补码 1000 是 4 1000 0000 是 1
  • std::hex 输入格式是否可以支持带有二进制补码表示法的负 int16_t 十六进制字符串,例如“ffff”代表“-1”?

    我想输入一个文本字符串ffff to a int16 t 该值应该是 1 这是一个简单的测试 C 程序 include
  • 为什么是补码?

    我正在编写一个教程来教孩子们 9 至 13 岁 编程 我从计算机本身开始 它们与计算机科学没有太大关系 更多的是涉及解决计算问题的过程 以此为出发点 我引导他们认识到机器可以帮助我们解决某些计算问题 人们擅长抽象思维和想象力 但计算机非常擅

随机推荐