我想知道一个字节的第一位是什么值。
例如:
我有
byte m = (byte) 0x8C;
我怎么知道第一位是 1 还是 0 ?
有人可以帮我吗?
这取决于你所说的“第一位”是什么意思。如果您的意思是“最高有效位”,您可以使用:
// 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;
如果第一位是最低位(即位0),则
if((m & 1) >0) ...
应该这样做。
一般来说,
if ((m & (1<<N)) > 0) ...
将告诉您是否设置了
N
位。
但是,如果您指的是最高位(位 7),则使用 N=7。
假设你的意思是最左边的位,按位和 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;
}
使用按位与运算符。
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
这有点麻烦,但你可以使用
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.
此代码为您提供 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
}
}
最高有效位 (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);
}