左移 1 次 31 (1 << 31) 如何获得最大 int 值?以下是我的想法和网上找到的一些解释

2024-01-17

我对位操作相当陌生,我正在尝试弄清楚 (1

首先我知道 1

1000000000000000000000000000

我知道它实际上是最小 int 值的补集,但是当我试图算出 (1

10000000000000000000000000000000 - 1 = 01111111111111111111111111111111

我几乎想相信它,因为它真的很简单。但这是真实发生的事情吗?如果不是,为什么它恰好是正确的?

我原本的想法是,真正的过程应该是:-1的补码是

11111111111111111111111111111111

那么 (1

(1)01111111111111111111111111111111

最左边的1被舍弃,那么我们就有了int的最大值。

我真的很困惑,不知道哪一个是正确的。


两者都是! 1

1000 0000 0000 0000 0000 0000 0000 0000

减去 1 得出:

0111 1111 1111 1111 1111 1111 1111 1111

有符号数的二进制补码布局的一个很好的功能是,加法和减法与它们的运算完全相同unsigned数字。因此 10000...000 表示二进制补码中的负数,即最大负数,在本例中为 -2,147,483,648,从中减去 1 会导致回绕到最大正数 2,147,483,647,但二进制补码数已排列这样我们就可以假装它是一个unsigned而是数字,因此减法并不复杂。从 10000...000 中减去 1 只是将前导 1 删除为 0,并借用一堆 1,与十进制中的相同,您会得到一堆 9:10000 - 1 = 9999。

从数学上来说也是如此,(a - b)是相同的(a + (-b)),所以我们可以做(1 << 31) + (-1)反而:

  1000 0000 0000 0000 0000 0000 0000 0000    (1 << 31)
  1111 1111 1111 1111 1111 1111 1111 1111    (-1)
-----------------------------------------
1 0111 1111 1111 1111 1111 1111 1111 1111    +

  0111 1111 1111 1111 1111 1111 1111 1111    (truncate)

1 从高端进位,一旦结果被截断回 32 位整数,该 1 就会丢失。

无论哪种方式,该模式(在高端有一个 0,然后用 1 填充)是任意宽度的二进制补码整数的最大正值的表示。

如果您愿意,还有其他方法可以生成该模式,例如~(1 << 31), and (-1 >>> 1) (where >>> means 逻辑右移 https://en.wikipedia.org/wiki/Logical_shift) 与整数的宽度无关。

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

左移 1 次 31 (1 << 31) 如何获得最大 int 值?以下是我的想法和网上找到的一些解释 的相关文章

  • 为什么 -INT_MIN = INT_MIN 在有符号的二进制补码表示中?

    我仍然没有找到为什么最低的有符号负数没有等效的有符号正数的原因 为简单起见 我的意思是 3 位二进制数 100 是 4 但我们不能有符号格式的正 4 因为我们不能 它溢出了 那么我们如何知道补码 1000 是 4 1000 0000 是 1
  • 为什么是补码?

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

    我有一些二进制数据 将两个字节值编码为有符号整数 bytes 1 255 0xFF bytes 2 251 0xF1 Decoding 这相当简单 我可以提取一个Int16这些字节的值 Int16 bytes 1 lt lt 8 Int16
  • 编译器如何实现位域运算?

    当询问如何做的问题时包裹 N 位有符号减法 https stackoverflow com questions 8309538 integer subtraction with wrap around for n bits我得到了以下答案
  • 使用按位 OR 0 对数字进行取整

    我的一位同事偶然发现了一种使用按位或来对浮点数进行底数的方法 var a 13 6 0 a 13 我们正在谈论它并想知道一些事情 它是如何工作的 我们的理论是 使用这样的运算符将数字转换为整数 从而删除小数部分 与这样做相比 它有什么优势吗
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • 对象中的最高值(如果有更多最大值并且它们相同,则更多)

    假设我有这样的对象 var obj a 5 b 10 c 15 d 20 e 20 f 25 我想获得前 3 个最高值 请注意d and e键具有相同的值 我也需要获取键 所以它看起来像 最高值 f 25日 20e 20 另外 如果有六个值
  • 如何有效地扫描每次迭代交替的 2 位掩码

    给定 2 个位掩码 应交替访问 0 1 0 1 我尝试获得运行时高效的解决方案 但找不到比以下示例更好的方法 uint32 t mask 2 uint8 t mask index 0 uint32 t f tzcnt u32 mask ma
  • C# 循环位左溢出问题

    我已经尝试让它工作好几天了 我已经阅读了一千个指南和人们的问题 但我仍然找不到正确的方法 我想做的是将这些位向左旋转 这是一个例子 原数 10000001 129我需要 00000011 3 我必须将这些位向左旋转一定的次数 这取决于用户输
  • 为什么 b = (b - x) & x 会得到下一个子集?

    The 有竞争力的程序员手册 https cses fi book book pdf第 99 页建议使用以下方法来遍历集合的所有子集x 集合位代表集合中的数字 int b 0 do Process subset b while b b x
  • 为什么 n & (n - 1) 总是从 n 中清除 1 位?

    给定一个数字n 按位运算n n 1 总是产生一个与 1 位相差的数字n 以下是一些示例 n 4 gt b 100 b 011 b 000 n 5 gt b 101 b 100 b 100 n 6 gt b 110 b 101 b 100 换
  • 不使用“-”运算符将两个数字相减

    我尝试使用以下代码 但我不明白为什么它给了我错误的答案 我正在计算 2 的补码并添加另一个数字 include
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 为什么long long 2147483647 + 1 = -2147483648? [复制]

    这个问题在这里已经有答案了 为什么这段代码不打印相同的数字 long long a b a 2147483647 1 b 2147483648 printf lld n a printf lld n b 我知道int变量的最大数量是2147
  • 将这个 if-then 逻辑转换为布尔表达式?

    我在使这段代码更简洁 最好是单个布尔表达式 方面有点绞尽脑汁 这是我的代码 if d Unemployed if type Unemployed tmp Unemployed true else tmp Unemployed false
  • 按位非运算符

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

    我想存储System currentTimeInMillis以尽可能小的空间存储在内存中 因为我必须将数百万个它们存储在内存中 我把它转换为binaryString这给了我41 bits 这是我的程序 public class BitSet
  • 如何在 JavaScript 中将 ArrayBuffer 与 DataView 结合使用

    我见过的关于 ArrayBuffer 的唯一真正的教程来自HTML5摇滚 https www html5rocks com en tutorials webgl typed arrays 但我特别想知道如何操作各个字节 例如 这个carto
  • 如何手动(按位)执行(浮动)x?

    现在 这是我应该实现的函数的函数头 float from int Return bit level equivalent of expression float x Result is returned as unsigned int bu

随机推荐