将整数转换为包含 3 个元素的布尔列表 (Java)

Convert Integer number to a Boolean List with 3 elements (Java)

我有一个区间为 [0,7] 的整数。我想将此数字转换为包含 3 个元素的布尔列表 Java.

列表中的第一个元素的值为 4,第二个元素的值为 2,第三个元素的值为 1。如果列表中的所有元素都为“真”,则它们的总和为 7。 “假”的值为 0。

以下是所有可能性:

If the number is 7 my boolean list is [true, true, true]

If the number is 6 my boolean list is [true, true, false]

If the number is 5 my boolean list is [true, false, true]

If the number is 4 my boolean list is [true, false, false]

If the number is 3 my boolean list is [false, true, true]

If the number is 2 my boolean list is [false, true, false]

If the number is 1 my boolean list is [false, false, true]

If the number is 0 my boolean list is [false, false, false]

我不想用 8 个 else if 块来编写代码。我认为必须有一个更聪明的数字组合解决方案。

这是我的函数声明:default List<Boolean> convertIntToBooleanList(int i);

你有什么想法我可以不用硬编码来解决它吗?

谢谢!

您需要将您的数字转换为以 2 为基数,然后,对于每个位,如果该位是 1,则将数组中的相应值设置为 true
示例:

7 = 111 = [true, true, true]
5 = 101 = [true, false, true]
4 = 100 = [true, false, false]

基本Java实现(不熟悉Java,因此解决方案可能会更优化):

public static void main (String[] args) throws java.lang.Exception
    {
        Integer x = 3;
        String binary = String.format("%3s", Integer.toBinaryString(x));
        List<Boolean> list = new ArrayList<Boolean>();
        for (int i = 0; i < binary.length(); i++) {
            list.add(binary.charAt(i) == '1');
        }
        System.out.println(list);
    }

可以用number&1确定首位是1还是0,用>>把每一位移到首位。

public static List<Boolean> convertIntToBooleanList(int i) {
    List<Boolean> list = new ArrayList<>();
    list.add((i>>2&1)!=0);
    list.add((i>>1&1)!=0);
    list.add((i&1)!=0);
    return list;
}

如果您想使用自己的方法转换为二进制,您可以repeatedly divide by 2将余数倒序排列:

  public static void main(String[] args) {   
    for(int i=0; i<=7; i++) {
      List<Boolean> bits = DecToBin(i, 3);
      System.out.println(i + " --> " + bits);
    }    
  }

  public static List<Boolean> DecToBin(int d, int padLength) {
    List<Boolean> bits = new ArrayList<Boolean>();
    while(d>0) {
      bits.add(0, ((d % 2) == 1)); // insert remainder at front
      d = d / 2; // integer division
    }
    while (bits.size() < padLength) {
      bits.add(0, false);
    }
    return bits;
  }

输出:

0 --> [false, false, false]
1 --> [false, false, true]
2 --> [false, true, false]
3 --> [false, true, true]
4 --> [true, false, false]
5 --> [true, false, true]
6 --> [true, true, false]
7 --> [true, true, true]