Bit Manipulation总结(二)

本文介绍了位运算在求解子集、反转二进制数、判断2的幂等问题中的应用。通过具体的Java代码实例,详细解析了Numberof1Bits、Subsets、ReverseBits及BitwiseANDofNumbersRange等问题的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章介绍通过位运算求解子集,反转二进制数,判断是否为2的幂等。

[b]1,Number of 1 Bits[/b]
给定一个无符号的整数,输出它包含1的个数。

通过右移,依次与1位与,得到1的个数。 代码如下:

public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int count = 0;
for(int i = 0; i < 32; i++) {
if((n >> i & 1) == 1) {
count ++;
}
}
return count;
}
}


[b]2,Subsets[/b]
给定一个没有重复元素的数组,输出所有的子集。
例如:给定nums[] = {1,2,3}
输出:[[3], [1], [2], [1,2,3], [1,3],[2,3],[1,2],[] ]

我们知道长度为n的集合,子集的个数为2的n次方个,我们通过0到2^n - 1正好可以表示子集的状态,具体代码如下:

public class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<Integer> list = new ArrayList<Integer>();
List<List<Integer>> llist = new ArrayList<List<Integer>>();
Arrays.sort(nums);
int helper = 1;
for(int i = 0; i < Math.pow(2, nums.length); i++) {
for(int j = 0; j < nums.length; j++) {
if(((i >> j) & helper) == 1) {
list.add(nums[j]);
}
}
llist.add(new ArrayList<Integer>(list));
list.clear();
}
return llist;
}
}


[b]3,Reverse Bits[/b]
给定一个无符号整数n,将它的二进制序列反转。

我们每次取n的最后一位,然后再通过左移,得到最终结果。 代码如下:

public class Solution {
// you need treat n as an unsigned value
public int reverseBits(int n) {
int result = 0;
for(int i = 0; i < 32; i++) {
result = result << 1;
result |= ((n >> i)& 1);
}
return result;
}
}


[b]4,Bitwise AND of Numbers Range[/b]
给定一个范围[m, n],将这个区间所有的数字位与,包括m和n, 0 <= m <= n <= 2147483647,输出最后结果。
例如,给定[5,7],输出:4

进行位与操作,位上有一个0,那么这个位置上肯定为0,因此我们只要从高位开始比较m和n,只要他们相等的位我们就保留,如果不相等就终止,因为后面肯定全为0。因为0 <= m <= n <= 2147483647,因此要把mask设定为长整型,因为把1左移31位后,如果是int型,最高位为符号位,与题意不符。代码如下:

public class Solution {
public int rangeBitwiseAnd(int m, int n) {
int result = 0;
long mask = 1L << 31;
while(mask > 0) {
if((m & mask) == (n & mask)) {
result |= (n & mask);
} else {
break;
}
mask = mask >> 1;
}
return result;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值