【发布时间】:2012-03-10 10:09:54
【问题描述】:
如果我有一个字节,该方法如何在某个位置检索位?
这是我所知道的,但我认为它不起作用。
public byte getBit(int position) {
return (byte) (ID >> (position - 1));
}
ID 是我从中检索信息的字节的名称。
【问题讨论】:
-
你快到了,你只需要通过与 0x01 进行 ANDing 来屏蔽刚刚移动的位
如果我有一个字节,该方法如何在某个位置检索位?
这是我所知道的,但我认为它不起作用。
public byte getBit(int position) {
return (byte) (ID >> (position - 1));
}
ID 是我从中检索信息的字节的名称。
【问题讨论】:
您想制作一个位掩码并按位与。这最终看起来与您所拥有的非常接近 - 使用 shift 设置适当的位,使用 & 进行按位运算。
所以
return ((byte)ID) & (0x01 << pos) ;
其中pos 必须介于 0 和 7 之间。如果您的最低有效位为“位 1”,那么您需要您的 -1,但我建议您不要这样做——这种位置变化是对我来说总是错误的来源。
【讨论】:
public byte getBit(int position)
{
return (ID >> position) & 1;
}
按位置右移 ID 将使#position 位在数字中最右侧的位置。将其与按位 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.
【讨论】:
获取整数的第 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 语言中,负移位计数会调用未定义的行为,因此该测试不一定有效(尽管它可能有效,具体取决于您的编译器/处理器的特定组合)。
【讨论】: