【问题标题】:Packing an array of booleans into an int in Java在Java中将一个布尔数组打包成一个int
【发布时间】:2015-09-13 14:03:57
【问题描述】:

我不太熟悉该过程中涉及的所有位移和掩码,但我有一个模糊的想法。

我正在寻找一种将大约 30 个布尔值打包成 int 或 long 的方法,这样我就可以通过一种数据类型发送打包的数据,而不是通过 30 个单独的布尔值发送。如果可能的话,或者使用位集可能会有所帮助。我想知道是否有人可以让我了解如何打包这些值。

【问题讨论】:

  • 我会做的最新手的技术如果排序无关紧要,我会简单地将 0 和 1 的布尔结果附加到一个字符串并发送过来。
  • 下面的所有答案都是有道理的,但是您打算如何阅读这个由 1 和 0 组成的数据结构?
  • BitSet to and from integer/long 的可能重复项
  • 我正在寻找最有效的方法,当然也是出于学习目的,因为我对位操作知之甚少,是的,它们需要订购,并且需要拆包时收到,因此可以使用这些值。

标签: java


【解决方案1】:

如果您有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;

【讨论】:

  • 您好,感谢您的演示。由于我这样做也是为了学习目的,您能否解释一下这里正在发生的转变?就像 if ((bits & 1
【解决方案2】:

一个布尔值代表一个比特信息,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

【讨论】:

  • 谢谢,是的,我收集了这个,但我更关心打包/拆包或“建筑”方面
【解决方案3】:

如果您有一个布尔值列表 Boolean b[30],您可以声明一个 int x = 0 并遍历 b 并为每次迭代执行 x = x*2 // move to next bitx = 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 为假,这也可以工作

【讨论】:

  • 那行得通。这也适用于解包,因为我必须读回数据并在它到达服务器时验证它
  • 您的结果 int 将类似于:1
【解决方案4】:

试试这个:

    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

我猜你可以用 & 而不是 | 解包

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    相关资源
    最近更新 更多