如何从一个字节获取某个位置的值?

时间:2012-02-20 00:39:32

标签: java byte bit

如果我有一个字节,该方法如何在某个位置检索一个位?

这是我所知道的,我觉得它不起作用。

public byte getBit(int position) {
    return (byte) (ID >> (position - 1));
}

其中ID是我从中检索信息的字节的名称。

4 个答案:

答案 0 :(得分:87)

public byte getBit(int position)
{
   return (ID >> position) & 1;
}

按位置右移ID会使位#位于数字右侧最远的位置。将其与按位AND &与1组合将告诉您该位是否已设置。

position = 2
ID = 5 = 0000 0101 (in binary)
ID >> position = 0000 0001

0000 0001 & 0000 0001( 1 in binary ) = 1, because the furthest right bit is set.

答案 1 :(得分:8)

你想制作一个掩码并按位进行。这将最终看起来非常接近你所拥有的 - 使用shift设置适当的位,使用&进行按位操作。

所以

 return ((byte)ID) & (0x01 << pos) ;

其中pos必须介于0到7之间。如果您的最低有效位为&#34;位1和#34;然后你需要你的-1,但我建议反对它 - 这种位置的改变总是导致我的错误来源。

答案 2 :(得分:1)

获取整数

中的第n位
 return ((num >> (n-1)) & 1);

答案 3 :(得分:1)

在Java中,以下工作正常:

if (value << ~x < 0) {
   // xth bit set
} else {
   // xth bit not set
}

valuex可以是intlong(并且不需要相同)。

非Java程序员注意事项:前面的表达式在Java中有效,因为在该语言中,位移运算符仅适用于5(或long的情况下为6 )右侧操作数的最低位。如果value << (~x & 31)value << (~x & 63),则隐式将表达式转换为value(或long

Javascript :它也适用于javascript(如java,只应用最低5位的移位计数)。在javascript中,任何number都是32位。

特别是在C中,负移位计数会调用未定义的行为,因此该测试不一定有效(尽管可能会有所不同,具体取决于您的编译器/处理器的特定组合)。