Java 删除字节的最后一位

Java 删除字节的最后一位,java,bit-manipulation,bitwise-operators,Java,Bit Manipulation,Bitwise Operators,例如,我有一个字节数组(字节数组可以大于或小于3个字节) 如何删除最后一位字节: 0b00000011,0b00111011,0b01010101 因为我想得到这样的结果11 | 011011 | 1010101 但是我不知道该怎么做,这不是很清楚,但也许我能理解:您想删除字节前的所有非有效位。你可以用一根绳子;在伪代码中: take a byte value N (or word or whatever) prepare an empty string ST while N<>0

例如,我有一个字节数组(字节数组可以大于或小于3个字节)

如何删除最后一位字节: 0b00000011,0b00111011,0b01010101 因为我想得到这样的结果11 | 011011 | 1010101
但是我不知道该怎么做,这不是很清楚,但也许我能理解:您想删除字节前的所有非有效位。你可以用一根绳子;在伪代码中:

take a byte value N (or word or whatever)
prepare an empty string ST
while N<>0
  if (N & 1)
    then ST = "1"+ST
    else ST = "0"+ST
  N = N >> 1
end
取一个字节值N(或字或其他)
准备一个空字符串
而N0
如果(N&1)
然后ST=“1”+ST
else ST=“0”+ST
N=N>>1
结束

现在字符串ST包含您想要的内容(如果您想要的是…。

这不是很清楚,但我可能理解:您想要删除字节前面的所有非有效位。你可以用一根绳子;在伪代码中:

take a byte value N (or word or whatever)
prepare an empty string ST
while N<>0
  if (N & 1)
    then ST = "1"+ST
    else ST = "0"+ST
  N = N >> 1
end
取一个字节值N(或字或其他)
准备一个空字符串
而N0
如果(N&1)
然后ST=“1”+ST
else ST=“0”+ST
N=N>>1
结束

现在,字符串ST包含您想要的内容(如果是您想要的…。

如果您想保留前导零,可以这样做

StringBuilder sb = new StringBuilder();
String sep = "";
for (byte b : bytes) {
    sb.append(sep);
    // set the top byte bit to 0b1000_0000 and remove it from the String
    sb.append(Integer.toBinaryString(0x80 | (b & 0x7F)).substring(1));
    sep = '|';
}
String s = sb.toString();

如果要保留前导零,可以这样做

StringBuilder sb = new StringBuilder();
String sep = "";
for (byte b : bytes) {
    sb.append(sep);
    // set the top byte bit to 0b1000_0000 and remove it from the String
    sb.append(Integer.toBinaryString(0x80 | (b & 0x7F)).substring(1));
    sep = '|';
}
String s = sb.toString();
如果数组长度超过4个字节,则可能存在未检测到的int溢出


如果数组长度超过4字节,则可能出现未检测到的int溢出。

首先,0xXXXXXX十六进制表示法。相反,请使用0bXXXXX。其次,应该使用位运算符:&(1010&1100->1000),|(1010&1100->1110),^(1010^1100->0110)和二进制移位(>>和2->00101011)。因此
myByte&0b0111111
将只保留
myByte
的最后7位。结果可能是一个
int
,如果是这样,只需将其转换回一个字节:
(byte)(myByte&0b01111111)
从左到右读取,我会将其称为第一位。您正在删除文本中表示值的位,即字符串形式,一个字节总是有8位,您不能更改。是的,我想将结果保存为整数。在第二种情况下,您需要前导零吗?如果是这样,那么为什么0b00000011没有前导零?首先,0xXXXXXX十六进制表示法。相反,请使用0bXXXXX。其次,应该使用位运算符:&(1010&1100->1000),|(1010&1100->1110),^(1010^1100->0110)和二进制移位(>>和2->00101011)。因此
myByte&0b0111111
将只保留
myByte
的最后7位。结果可能是一个
int
,如果是这样,只需将其转换回一个字节:
(byte)(myByte&0b01111111)
从左到右读取,我会将其称为第一位。您正在删除文本中表示值的位,即字符串形式,一个字节总是有8位,您不能更改。是的,我想将结果保存为整数。在第二种情况下,您需要前导零吗?如果是,那么为什么0b00000011没有前导零?
1101110111010101