左移 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 值?以下是我的想法和网上找到的一些解释 的相关文章

  • 包含按位与 (&) 或按位异或 (^) 的运算是否有等价的十进制?

    考虑以下表达式 其中两个操作数都是十进制 a b or a b 我知道运算符对操作数的二进制数字执行什么操作 因此我知道答案如何 的a b or a b被计算 我不知道这些运算是否可以转换为十进制形式 例如 我们可以说a lt
  • 最大乘法列数

    我有一个小问题 在我的表中我有这些行 PersHist ID Date Histroy 1 01 01 2008 0 1 01 01 2008 1 1 01 01 2008 2 1 02 01 2008 0 1 02 01 2008 1 现
  • 按位相等

    我需要在两个字节之间执行按位相等 这意味着 例如 如果我有两个字节 00011011 和 00011110 结果是 11111010 我看到的唯一快速方法是使用以下语句 byte a b set input bytes byte c a b
  • C hack 用于存储占用 1 位空间的位?

    我有一长串 0 到 67600 之间的数字 现在我想使用一个 67600 个元素长的数组来存储它们 如果某个数字在集合中 则该元素设置为 1 如果该数字不在集合中 则该元素设置为 0 IE 每次我只需要 1 位信息来存储数字的存在 C C
  • 检查位掩码的特定位

    我正在与Bitmasks in python 据我所知 这些是整数数组 当它们解压缩为二进制格式时 它们会告诉您数组中给定元素的 32 位中的哪一个被设置 1 我想知道检查数组的任何元素是否设置了 4 个特定位的最快方法 我不关心其余的 我
  • 用 t 个随机数生成位向量

    我想生成一个数组 向量v大小的p with t那些和p t零 的位置t ones must是随机的 这是我迄今为止编写的解决方案 但我不确定它是否是最有效的解决方案 另外我从来没用过random device or mt19937 找到他们
  • F找出打开所有灯泡的最少开关数量

    我试图理解给出的问题here http qa geeksforgeeks org 4118 find the minimum number switches you have press turn all bulbs及其解决方案 问题指出
  • 什么是低位和高位?

    谁能告诉我什么是低位和高位 如何识别高位和低位 下面是二进制形式 如何0110里面有更高位吗 0110 0111 1100 1010 1100 0111 1001 1011 就像十进制一样 二进制中较高位通常写在左侧 所以如果你看到0111
  • 在 C++ 中求和 1<<2 和 1<<3 时出现奇怪的输出

    所以我只是尝试用 C 进行一些位操作 这是我尝试过的 int a 1 lt lt 2 cout lt
  • Java 数组中的最小值和最大值

    我的代码没有给出错误 但它没有显示最小值和最大值 代码是 Scanner input new Scanner System in int array new int 10 System out println Enter the numbe
  • 我可以访问 TBits 内部位图吗?

    In particular i want to preset desired size fetch a bitmap from external source and then work with data in classy object
  • 公钥的长度(加密)可以与私钥不同吗?

    我有一个 1024 位的私钥 并用它来生成公钥 这是否自动意味着我的公钥也具有 1024 加密 或者它的加密大小可以更小吗 512 256 PS 我最感兴趣并谈论的是 RSA 密钥中模数 n 的大小 大小通常为 1024 或 2048 位
  • sql server中基于分区的Min()和Max()

    我想使用最小和最大函数 但要符合某些标准 Create Table Test Id Int Identity 1 1 Category Varchar 100 DateTimeStamp DateTime Insert into Test
  • 按位移位(左移或右移)有什么作用以及它的用途是什么?

    我见过运营商 gt gt and lt lt 在我看过的各种代码中 我真正理解的都不是 但我只是想知道它们实际上做了什么以及它们的一些实际用途是什么 如果班次就像x 2 and x 2 与实际使用的真正区别是什么 and 运营商 有性能差异
  • 无需使用abs函数或if语句即可获取绝对值

    我在想如何在不使用的情况下获得整数的绝对值if声明也不abs 起初我使用的是左移位 lt lt 试图将负号移出范围 然后将位右移回原来的位置 但不幸的是它对我不起作用 请让我知道为什么它不起作用以及其他替代方法 From 位摆弄黑客 htt
  • 在 C++ 中将 64 位值左移 64 位给出奇怪的结果[重复]

    这个问题在这里已经有答案了 可能的重复 64位移位问题 https stackoverflow com questions 1024968 64bit shift problem 我在 Windows 8 64 位上使用 Visual St
  • 在 Haskell 中将字节转换为 Int64s/Floats/Doubles

    我正在尝试解析 Haskell 中的二进制文件格式 Apple 的二进制属性列表格式 该格式所需的内容之一是将字节序列视为 a 无符号 1 2 或 4 字节整数 b 有符号 8 字节整数 c 32 位floats d 64 位doubles
  • 为什么是补码?

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

    我有一个位计数方法 我正在尝试尽可能快地实现 我想尝试下面的算法位摆弄黑客 http graphics stanford edu seander bithacks html CountBitsSetParallel 但我不知道 C 什么是
  • 列的 SQL MAX(包括其主键)

    Short 从下面的 sql select 中 我获取了 cart id 和该购物车中最高价值商品的值 SELECT CartItems cart id MAX ItemValues value FROM CartItems INNER J

随机推荐