如何找到最高有效位(MSB)

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

我想知道一个字节的第一位是什么值。

例如:

我有

byte m = (byte) 0x8C;

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

有人可以帮我吗?

java bit-manipulation
7个回答
24
投票

这取决于你所说的“第一位”是什么意思。如果您的意思是“最高有效位”,您可以使用:

// 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;

3
投票

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

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

应该这样做。

一般来说,

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

将告诉您是否设置了

N
位。 但是,如果您指的是最高位(位 7),则使用 N=7。


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;
}

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

1
投票

这有点麻烦,但你可以使用

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

这适用于

byte
short
int
long
数据类型。

但是对于大多数类型,最简单的方法是与 0 进行比较

if (x < 0) // top bit set.

这适用于

byte
short
int
long
float
double

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

对于

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

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

0
投票

此代码为您提供 msb(最高有效位)/最大数字,这是 2 的幂且小于任何给定数字。

class msb{
void main(){
        int n=155;//let 110001010
        int l=(Integer.toBinaryString(n)).length();//9
        String w="0"+Integer.toBinaryString(i).substring(1);//010001010
        i=Integer.parseInt(w,2);
        System.out.println(n^i);//110001010^010001010=100000000
}
}

0
投票

最高有效位 (MSB) 是多位二进制数中具有最大值的位。

要查找 MSB,您可以使用

int msb = Integer.highestOneBit(n);

n = 11 (1011) 将得到 8 (1000)

要找到MSB的位置,您可以使用

int mostSigBitPosition(int n) {
    return 32 - Integer.numberOfLeadingZeros(n);
}

n = 11 (1011) 将为您提供 4(如果我们从 1 开始索引位,则 MSB 位于位置 4)

其中

Integer.highestOneBit(n)
Integer.numberOfLeadingZeros(n)
java.lang.Integer
类的方法

int highestOneBit(int i) {
    return i & (0x80000000 >>> numberOfLeadingZeros(i));
}
int numberOfLeadingZeros(int i) {
  if (i <= 0)
    return i == 0 ? 32 : 0;
  int n = 31;a
  if (i >= 1 << 16) { n -= 16; i >>>= 16; }
  if (i >= 1 <<  8) { n -=  8; i >>>=  8; }
  if (i >= 1 <<  4) { n -=  4; i >>>=  4; }
  if (i >= 1 <<  2) { n -=  2; i >>>=  2; }
  return n - (i >>> 1);
}

© www.soinside.com 2019 - 2024. All rights reserved.