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

问题描述 投票:0回答:5

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

这是我所知道的,但我认为这不起作用。

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

其中

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

java byte bit
5个回答
125
投票
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.

10
投票

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

&
进行按位运算。

那么

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

其中

pos
的范围必须在 0 到 7 之间。如果您的最低有效位为“位 1”,那么您需要
-1
但我建议不要这样做——这种位置的改变始终是我的错误来源。


3
投票

获取整数中的第n位

 return ((num >> (n-1)) & 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 中,负移位计数会调用未定义的行为,因此此测试不一定有效(尽管可能会有效,具体取决于编译器/处理器的特定组合)。


0
投票

要在任意位置获取钻头,只需执行以下步骤:

  1. 创建位掩码
  2. 进行与(AND)按位运算

在数字 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.
© www.soinside.com 2019 - 2024. All rights reserved.