
java.util.bitset 是java提供的一个用于存储位序列的类,它以一种高效的方式管理一系列布尔值(位)。bitset 内部经过优化,非常适合进行位操作,并且能够自动扩展以适应所需的位数。
BitSet 提供了一个静态工厂方法 valueOf(long[] longs),可以方便地将一个或多个 long 值转换为 BitSet。由于 int 可以隐式转换为 long,我们可以直接使用此方法。
需要注意的是,BitSet 的位索引顺序是从低位到高位(Least Significant Bit, LSB 到 Most Significant Bit, MSB)。也就是说,索引 0 对应着最低有效位。
示例代码:将整数转换为 BitSet
import java.util.BitSet;
import java.util.Arrays; // 用于打印布尔数组
public class IntegerToBinaryBooleanArrayConverter {
public static void main(String[] args) {
int input1 = 12; // Binary 1100
BitSet bitSet1 = BitSet.valueOf(new long[] { input1 });
System.out.println("整数: " + input1 + ", BitSet表示: " + bitSet1);
// 输出示例: 整数: 12, BitSet表示: {2, 3} (表示第2和第3位被设置)
int input2 = 15; // Binary 1111
BitSet bitSet2 = BitSet.valueOf(new long[] { input2 });
System.out.println("整数: " + input2 + ", BitSet表示: " + bitSet2);
// 输出示例: 整数: 15, BitSet表示: {0, 1, 2, 3} (表示第0,1,2,3位被设置)
System.out.println("\n--- 转换为布尔数组 (MSB到LSB) ---");
// 示例:12 转换为 MSB到LSB,长度为4
boolean[] arr12MSB = toBooleanArrayMSB(12, 4);
System.out.println("12 (MSB, 长度4): " + Arrays.toString(arr12MSB));
// 期望输出: [true, true, false, false] (对应 1100)
// 示例:15 转换为 MSB到LSB,长度为6
boolean[] arr15MSB = toBooleanArrayMSB(15, 6);
System.out.println("15 (MSB, 长度6): " + Arrays.toString(arr15MSB));
// 期望输出: [false, false, true, true, true, true] (对应 001111)
// 示例:8 转换为 MSB到LSB,长度为3 (实际需要4位,BitSet.length()会决定)
boolean[] arr8MSB = toBooleanArrayMSB(8, 3);
System.out.println("8 (MSB, 长度3): " + Arrays.toString(arr8MSB));
// 期望输出: [true, false, false, false] (对应 1000)
// 示例:0 转换为 MSB到LSB,长度为1
boolean[] arr0MSB = toBooleanArrayMSB(0, 1);
System.out.println("0 (MSB, 长度1): " + Arrays.toString(arr0MSB));
// 期望输出: [false]
}
/**
* 将整数转换为MSB到LSB顺序的布尔数组。
* 数组的最小长度由minLength指定,如果整数二进制表示所需位数超过minLength,则自动扩展。
*
* @param value 要转换的整数。
* @param minLength 结果数组的最小长度。
* @return 表示整数二进制的布尔数组,True为1,False为0,顺序为MSB到LSB。
*/
public static boolean[] toBooleanArrayMSB(int value, int minLength) {
BitSet bitSet = BitSet.valueOf(new long[] { value });
// 确定结果数组的实际长度
// bitSet.length() 返回最高设置位的索引加一,如果为0则表示数字0
int actualLength = Math.max(minLength, bitSet.length());
// 特殊处理0,如果minLength为0,但我们至少需要一个false
if (value == 0 && actualLength == 0) {
actualLength = 1;
}
boolean[] result = new boolean[actualLength];
for (int i = 0; i < actualLength; i++) {
// 从最高位(数组索引0)开始填充,对应BitSet的低位
// 例如,对于长度为4的数组,i=0对应最高位,需要检查BitSet的第3位
// i=actualLength-1对应最低位,需要检查BitSet的第0位
result[i] = bitSet.get(actualLength - 1 - i);
}
return result;
}
/**
* 将整数转换为LSB到MSB顺序的布尔数组。
* 数组长度由整数的有效位数决定。
*
* @param value 要转换的整数。
* @return 表示整数二进制的布尔数组,True为1,False为0,顺序为LSB到MSB。
*/
public static boolean[] toBooleanArrayLSB(int value) {
BitSet bitSet = BitSet.valueOf(new long[] { value });
int len = bitSet.length();
// 对于0,BitSet.length()为0,但我们可能需要至少一个False表示
if (value == 0 && len == 0) {
return new boolean[]{false};
}
boolean[] result = new boolean[len];
for (int i = 0; i < len; i++) {
result[i] = bitSet.get(i);
}
return result;
}
}从上述输出可以看出,BitSet 打印的 {2, 3} 意味着第2位和第3位(从0开始计数)被设置为 true,这与 1100 的二进制表示是吻合的(2^2 + 2^3 = 4 + 8 = 12)。同样,{0, 1, 2, 3} 对应 1111(2^0 + 2^1 + 2^2 + 2^3 = 1 + 2 + 4 + 8 = 15)。
立即学习“Java免费学习笔记(深入)”;
一旦有了 BitSet,我们可以通过遍历其位来生成所需的 boolean 数组。由于 BitSet 默认是 LSB 到 MSB 的顺序,如果需要 MSB 到 LSB 的顺序(如 1100 对应 {True, True, False, False}),则需要进行反转。
在上述 main 方法中,我们提供了 toBooleanArrayMSB 方法的实现,它能够根据 minLength 参数灵活地生成 MSB 到 LSB 顺序的布尔数组。
在 toBooleanArrayMSB 方法中,minLength 参数允许我们指定一个最小的数组长度。如果整数的二进制表示所需的位数少于 minLength,则会在前面填充 False(相当于前导零)。如果整数所需的位数超过 minLength,则数组长度会自动扩展以容纳所有有效位。
java.util.BitSet 提供了一种强大且高效的方式来处理整数的二进制表示。通过 BitSet.valueOf() 方法,我们可以轻松地将整数转换为一个位集合,然后根据需求(如位顺序和固定长度)将其转换为 boolean 数组。这种方法不仅代码简洁,而且在性能上也表现出色,是处理此类转换问题的推荐方案。理解 BitSet 的 LSB 优先特性是正确实现转换的关键。
以上就是Java整数到二进制布尔数组的转换:BitSet的高效应用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号