对于Java中的按位操作,我是否需要关注Java中的大多数数字类型是否已签名?

时间:2012-10-11 01:36:11

标签: java math bit-manipulation signed primitive-types

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

如果我想用Java中的一个原始数字类型进行逐位算术,我可以简单地将其视为无符号值,还是需要避免使用负数,即始终保持最高位数设为0?例如,我可以使用int作为无符号32位数,还是应该只使用最低31位?

我正在寻找尽可能多的答案,但让我举一个例子:假设我要存储32个标志。如果我使用像

这样的东西,我可以将它们全部存储在一个int中
store = store & ~(1 << index) | (value << index)

将标记index设置为value,类似

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

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

我知道我需要一直使用&gt;&gt;&gt;而不是&gt;&gt;对于正确的转移,但这是唯一的问题吗?或者,当我使用最高位时,是否会出现与负数的两个补码表示相关的其他问题?

2 个答案:

答案 0 :(得分:3)

  

我知道我需要一直使用&gt;&gt;&gt;而不是&gt;&gt;对于正确的转移,但这是唯一的问题吗?

是的,这是唯一的问题。向左移位对有符号和无符号数字的作用相同;同样适用于ANDORXOR。只要您使用>>>进行右移,就可以使用已签名int的所有32位。

答案 1 :(得分:2)

在该上下文中也有合理的理由使用>>(一种常见的情况是直接制作应该为0或-1的掩码,而不必否定0或1的掩码),所以根本没有任何顾虑。请注意你正在做的事情,以确保它符合你的意图。

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

  • 右移
  • 部门(Java中未提供的未签名表格)
  • modulo(Java中不提供的未签名表单)
  • 比较(相等除外)(Java中没有的无符号表格)

不关心签名的操作是:

  • XOR
  • 除了
  • 减法
  • 两个补语否定(-x表示~x + 1
  • 一个补码(~x表示-x - 1
  • 左移
  • 乘法