这是一个非常基本的问题,但我从来没有完全相信自己,我对“它没有任何区别”的直观回答是正确的,所以也许有人有一个很好的方法来理解这一点:
如果我想用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;对于正确的转移,但这是唯一的问题吗?或者,当我使用最高位时,是否会出现与负数的两个补码表示相关的其他问题?
答案 0 :(得分:3)
我知道我需要一直使用&gt;&gt;&gt;而不是&gt;&gt;对于正确的转移,但这是唯一的问题吗?
是的,这是唯一的问题。向左移位对有符号和无符号数字的作用相同;同样适用于AND
,OR
和XOR
。只要您使用>>>
进行右移,就可以使用已签名int
的所有32位。
答案 1 :(得分:2)
在该上下文中也有合理的理由使用>>
(一种常见的情况是直接制作应该为0或-1的掩码,而不必否定0或1的掩码),所以根本没有任何顾虑。请注意你正在做的事情,以确保它符合你的意图。
关注签名的操作(即它们具有不同的带有不同语义的签名和无符号形式):
不关心签名的操作是:
-x
表示~x + 1
)~x
表示-x - 1
)