如何找到最重要的位(MSB)

时间:2011-09-28 17:16:43

标签: java bit-manipulation

我想知道一个字节的第一位有哪个值。

例如:

我有byte m = (byte) 0x8C;

我怎么知道第一位是1还是0?

任何人都可以帮助我吗?

5 个答案:

答案 0 :(得分:21)

这取决于你的意思是“第一位”。如果您的意思是“最重要的位”,您可以使用:

// 0 or 1
int msb = (m & 0xff) >> 7;

或者,如果您不介意值为0x80或0,请使用:

// 0 or 0x80
int msb = m & 0x80;

或者事实上,作为boolean

// Uses the fact that byte is signed using 2s complement
// True or false
boolean msb = m < 0;

如果你的意思是最低有效位,你可以使用:

// 0 or 1
int lsb = m & 1;

答案 1 :(得分:3)

假设你的意思是最左边的位,按位,它是0x80并检查它是否为零:

public boolean isFirstBitSet(byte b) {
    System.out.println((b & (byte)0x80));
    return (b & (byte)0x80) < 0;
}

如果你的意思是最低位,你需要和0x01并检查一个不同的条件:

public boolean isFirstBitSet(byte b) {
    System.out.println((b & (byte)0x01));
    return (b & (byte)0x80) > 0;
}

答案 2 :(得分:3)

如果第一位是最低位(即位0),那么

if((m & 1) >0) ...

应该这样做。

一般来说,

if ((m & (1<<N)) > 0) ...

将为您提供是否设置位N。 但是,如果您指的是最高位(第7位),则使用N = 7.

答案 3 :(得分:1)

使用按位和运算符。

public class BitExample {
    public static void main(String args[]) throws Exception {
        byte m = (byte)0x8C;
        System.out.println("The first bit is " + (m & (byte)0x01));
        m = (byte)0xFF;
        System.out.println("The first bit is " + (m & (byte)0x01));
    }
}

// output is...
The first bit is 0
The first bit is 1

答案 4 :(得分:1)

它有点像黑客,但你可以使用

if(x >> -1 != 0) // top bit set.

这适用于byteshortintlong数据类型。

然而,对于大多数类型,最简单的方法是与0

进行比较
if (x < 0) // top bit set.

适用于byteshortintlongfloatdouble

(忽略负零和负NaN,大多数人都这样做;)

对于char类型,您需要知道位数。 ;)

if (ch >>> 15 != 0) // top bit set.