我对这个过程中涉及的所有位移和掩码都不是很熟悉,但我的想法很模糊。
我正在寻找一种将大约30个布尔值打包成int或long的方法,这样我就可以通过一种数据类型发送打包数据,而不是发送30个单独的布尔值。如果可能,或者使用位集可能会有所帮助。我想知道是否有人可以给我一些关于如何打包价值的见解。
答案 0 :(得分:6)
如果你有一个int
(32位),你可以这样设置,清除和检查第N(0-31)位:
int bits = 0;
// Set bit n
bits |= 1 << n;
// Clear bit n
bits &= (1 << n) ^ -1;
// Check bit n
if ((bits & 1 << n) != 0) { /*bit was set*/ }
因此,要将boolean
数组转换为位掩码:
boolean[] bools = /*allocated elsewhere, max. length: 32*/;
int bits = 0;
for (int i = 0; i < bools.length; i++)
if (bools[i])
bits |= 1 << i;
将位掩码转换为boolean
数组:
int bits = /*assigned elsewhere*/;
boolean[] bools = new boolean[30]; /*max. length: 32*/
for (int i = 0; i < bools.length; i++)
if ((bits & 1 << i) != 0)
bools[i] = true;
答案 1 :(得分:3)
布尔表示一些信息,30布尔代表30位信息。构建int
(32位),发送,完成工作。
可能不是最好的方法,只是为了给你一个想法
int i=0;
boolean[]a = {true,false,true,false,false,false,false};
for(boolean b:a)i=i*2+(b?1:0);
System.out.println(Integer.toBinaryString(i));
打印
1010000
答案 2 :(得分:0)
如果你有一个布尔值列表Boolean b[30]
,你可以声明一个int x = 0
并迭代b,并且每次迭代都会x = x*2 // move to next bit
和x = x+1 // if b is true
Boolean b[30]; // assign values to array...
int x = 1;
for (int i=0; i<30; i++){
if (b[i] == true ){
x = x+1;
}
x = x*2;
}
现在,您可以查看x并在第一个之后检查30位。当位等于1时,表示相应的布尔值为真。第一个位被初始化为1,所以即使第一个bool是假的,这也行。
答案 3 :(得分:0)
试试这个:
boolean b[] = new boolean[32];
b[2] = true;
b[31] = true;
int m = 0x01;
int n = 0;
for(int j = b.length - 1; j >=0; j--) {
if(b[j]) n |= m;
m = (m<< 1);
}
System.out.println(Integer.toBinaryString(n));
// Output: 100000000000000000000000000001
我猜你可以通过&amp;打开包装而不是|