gpt4 book ai didi

java - 我们可以将整数存储在少于 4 个字节中吗?

转载 作者:行者123 更新时间:2023-11-29 03:09:19 29 4
gpt4 key购买 nike

我知道在 Java 中使用 short 可以存储最小值 -32,768 和最大值 32,767(含)。
使用 int 我们可以存储最小值 -2^31 和最大值 2^31-1
问题:如果我有一个 int[] numbers 并且我可以存储的数字最多为 1000 万。
是否可以以某种方式存储这些数字而不必为每个数字使用 4 个字节?我想知道对于特定的“小”范围是否可能有一些“黑客/技巧”,以便我可以使用比 numbers.length*4

更少的内存

最佳答案

您可以通过使用掩码或位操作来尝试使用较少的位数来表示每个数字,然后如果您希望获得完整的位数,则稍后执行符号扩展。这种操作在当今几乎所有计算机系统中都是在系统架构级别完成的。

它可能会帮助你研究2's Complement ,这似乎是你想要的......并且可能 Sign Extension很好的衡量标准。

通常,在高级语言中,int 由处理器寄存器的基本大小表示。例如)8、16、32 或 64 位。

如果您使用 2's-Complement 方法,则可以根据需要轻松解释所有正数和负数。这在硬件上也非常容易,因为您只需将所有位取反然后加 1,这可能会证明比其他可能的方法有很大的性能提升。


2 的补码如何工作:

  • 通过反转所有位得到-N,然后加 1

即求N的1补码,然后加1。

For example with 8-bit words:
9 = 00001001
-9 = 11110111 (11110110 + 1)

在硬件中轻松高效(取反然后+1)
• n 位字可用于表示数字从 -2^(N-1) 到 +(2^(N-1) - 1)



更新:表示更大数字的位运算。

如果你想得到一个更大的数字,比如评论中的 1,000,000,那么你可以使用按位左移操作,然后通过将当前数字增加 2 的适当次方来提取数字。

    9 (base 10): 00000000000000000000000000001001 (base 2)
--------------------------------
9 << 2 (base 10): 00000000000000000000000000100100 (base 2) = 36 (base 10)

你也可以试试:( Zero-fill right shift )

此运算符将第一个操作数向右移动指定的位数。向右移出的多余位将被丢弃。零位从左边移入。符号位变为 0,因此结果始终为非负数。

对于非负数,零填充右移和符号传播右移产生相同的结果。例如,9 >>> 2 产生 2,与 9 >> 2 相同:

9 (base 10): 00000000000000000000000000001001 (base 2)
--------------------------------
9 >>> 2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)

但是,负数不是这种情况。例如,-9 >>> 2 产生 1073741821,这与 -9 >> 2(产生 -3)不同:

-9 (base 10): 11111111111111111111111111110111 (base 2)
--------------------------------
-9 >>> 2 (base 10): 00111111111111111111111111111101 (base 2) = 1073741821 (base 10)

正如其他人在评论中所说的那样,如果您尝试操作不是专门针对字/双/等对齐的数据,从长远来看,您实际上可能会影响您的整体性能。这是因为您的硬件将不得不更加努力地工作,以尝试拼凑出您真正需要的东西。

关于java - 我们可以将整数存储在少于 4 个字节中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30332690/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com