如果我有一个字节,该方法如何在某个位置检索一个位?
这是我所知道的,我觉得它不起作用。
public byte getBit(int position) {
return (byte) (ID >> (position - 1));
}
其中ID
是我从中检索信息的字节的名称。
答案 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
}
value
和x
可以是int
或long
(并且不需要相同)。
非Java程序员注意事项:前面的表达式在Java中有效,因为在该语言中,位移运算符仅适用于5(或long
的情况下为6 )右侧操作数的最低位。如果value << (~x & 31)
为value << (~x & 63)
,则隐式将表达式转换为value
(或long
。
Javascript :它也适用于javascript(如java,只应用最低5位的移位计数)。在javascript中,任何number
都是32位。
特别是在C中,负移位计数会调用未定义的行为,因此该测试不一定有效(尽管可能会有所不同,具体取决于您的编译器/处理器的特定组合)。