3

变速杆...

我必须做点什么,让我心烦意乱。

我得到一个十六进制值作为字符串(例如:“AFFE”)并且必须决定是否设置了字节一的第 5 位。

public boolean isBitSet(String hexValue) {
    //enter your code here
    return "no idea".equals("no idea")
}

有什么提示吗?

问候,

博斯科普

4

4 回答 4

8

最简单的方法是转换Stringint,并使用位运算:

public boolean isBitSet(String hexValue, int bitNumber) {
    int val = Integer.valueOf(hexValue, 16);
    return (val & (1 << bitNumber)) != 0;
}               ^     ^--- int value with only the target bit set to one
                |--------- bit-wise "AND"
于 2012-04-25T14:13:47.410 回答
1

假设字节一由最后两位数字表示,并且字符串的大小固定为 4 个字符,那么答案可能是:

return (int)hexValue[2] & 1 == 1;

如您所见,您不需要将整个字符串转换为二进制来评估第 5 位,它确实是第 3 个字符的 LSB。

现在,如果十六进制字符串的大小是可变的,那么您将需要类似:

return (int)hexValue[hexValue.Length-2] & 1 == 1;

但是由于字符串的长度可以小于 2,所以它会更安全:

return hexValue.Length < 2 ? 0 : (int)hexValue[hexValue.Length-2] & 1 == 1;

正确答案可能会有所不同,具体取决于您认为是字节 1 和位 5 的内容。

于 2012-04-25T14:27:23.430 回答
0

这个怎么样?

 int x = Integer.parseInt(hexValue);
 String binaryValue = Integer.toBinaryString(x);

然后您可以检查字符串以检查您关心的特定位。

于 2012-04-25T14:14:03.667 回答
0

使用 BigInteger 和它的 testBit 内置函数

static public boolean getBit(String hex, int bit) {
    BigInteger bigInteger = new BigInteger(hex, 16);
    return bigInteger.testBit(bit);
}
于 2016-11-28T21:37:35.020 回答