4

这是一个非常基本的问题,但我从来没有完全说服自己我对“没有区别”的直观回答是正确的,所以也许有人有一个很好的方法来理解这一点:

如果我想要对 Java 中的一种原始数字类型做的只是按位算术,我可以简单地将其视为无符号值还是我需要避免负数,即始终将最高位设置为 0 ? 例如,我可以像使用无符号 32 位数字一样使用 int,还是应该只使用最低 31 位?

我正在寻找尽可能一般的答案,但让我举个例子:假设我想存储 32 个标志。如果我使用类似的东西,我可以将它们全部存储在一个 int 中吗

store = store & ~(1 << index) | (value << index)

设置标志和index类似的value东西

return (store & (1 << index)) != 0

检索标志indexindex或者,如果我将标志设置为31 为 1 ,我是否会遇到此代码或类似代码的任何问题?

我知道我需要始终使用 >>> 而不是 >> 进行右移,但这是唯一的问题吗?或者当我使用最高位时,是否会出现与负数的二进制补码表示相关的其他问题?

4

2 回答 2

3

我知道我需要始终使用 >>> 而不是 >> 进行右移,但这是唯一的问题吗?

是的,这是唯一的担忧。左移对有符号数和无符号数的作用相同;ANDing、ORing 和ing 也是如此XOR。只要使用>>>for 右移,就可以使用有符号的所有 32 位int

于 2012-10-11T01:41:27.123 回答
2

在这种情况下也有合理的理由使用>>(一个常见的情况是直接制作应该为 0 或 -1 的掩码,而不必否定 0 或 1 的掩码),所以根本不用担心. 请注意您正在做的事情,以确保它符合您的意图。

关心签名的操作(即它们具有不同语义的有符号和无符号形式)是:

  • 右移
  • 除法(Java 中没有无符号形式)
  • 模(Java 中没有无符号形式)
  • 比较(相等除外)(Java 中没有无符号形式)

不关心签名的操作是:

  • 或者
  • 异或
  • 添加
  • 减法
  • 二进制补码否定(-x手段~x + 1
  • 一个补码(~x意思-x - 1
  • 左移
  • 乘法
于 2012-10-11T10:30:08.370 回答