将整数转换为包含 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]
我有一个区间为 [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]