如果我有一个字节,该方法将如何检索某个位置的位?
这是我所知道的,但我认为这不起作用。
public byte getBit(int position) {
return (byte) (ID >> (position - 1));
}
其中
ID
是我从中检索信息的字节的名称。
public byte getBit(int position)
{
return (ID >> position) & 1;
}
按位置右移 ID 将使#position 位位于数字中最右边的位置。将其与 1 的按位 AND
&
相结合将告诉您该位是否已设置。
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.
您想要制作一个位掩码并进行按位与。这最终看起来非常接近你所拥有的——使用shift设置适当的位,使用
&
进行按位运算。
那么
return ((byte)ID) & (0x01 << pos) ;
其中
pos
的范围必须在 0 到 7 之间。如果您的最低有效位为“位 1”,那么您需要 -1
但我建议不要这样做——这种位置的改变始终是我的错误来源。
获取整数中的第n位
return ((num >> (n-1)) & 1);
在 Java 中,以下工作正常:
if (value << ~x < 0) {
// xth bit set
} else {
// xth bit not set
}
value
和 x
可以是 int
或 long
(并且不需要相同)。
非 Java 程序员的警告:前面的表达式在 Java 中有效,因为在该语言中,位移运算符仅适用于右侧操作数的 5 个(或 6 个,在
long
的情况下)最低位。这隐式地将表达式转换为 value << (~x & 31)
(如果 value << (~x & 63)
是 value
,则为 long
)。
Javascript:它也适用于 javascript(与 java 一样,仅应用移位计数的最低 5 位)。在 javascript 中,任何
number
都是 32 位。
特别是在 C 中,负移位计数会调用未定义的行为,因此此测试不一定有效(尽管可能会有效,具体取决于编译器/处理器的特定组合)。
要在任意位置获取钻头,只需执行以下步骤:
在数字 5 中,位置是从右到左(由索引给出) 数字 (5) = |0|1|0|1| 位置 = |3|2|1|0|
现在您想要获取第 3 个位置的位(索引 = 2)
int bitMask = 1 << position
int newNumber = bitMask & number
即:
int number = 5
int position = 2
int bitMask = 1 << position
// bitMask value becomes here:
// 1 << 2 (0001 << 2) becomes 0100
int newNumber = bitMask & number
// do AND (& bitwise) operation with bitMask and number
0100 & 0101 becomes 0100
newNumber = 4 (0100)
您可以返回 true 或 false,例如:
return ((bitMask & number) != 0)
// means if the new number is non-zero, it means the bit as position is 1 otherwise false.