判断一个数是否是2的幂次方
我们可以发现2的次方数n和n-1的二进制对应如下:
2 10 01
4 100 011
8 1000 0111
16 10000 01111
。。。。。。。。。。。。。。。即n&(n-1)==0
而要确定n是2的几次方则直接数>>1右移次数即可
public static int test(int n)
{
int res = -1;
if((n&(n-1))==0)
while(n!=0)
{
n = n>>1;
res+=1;
}
return res;
}
判断一个数字的二进制数中1的位数
while(U!=0)
{
count++;
U=U&(U-1);
}
数组中只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
^异或运算的性质
a^0 =a;
a^a =0;
异或运算满足交换律和结合律,a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。
class Solution {
public int singleNumber(int[] nums) {
int single = 0;
for (int num : nums) {
single ^= num;//数组中全部做^运算
}
return single;
}
}
子集的问题
public List<List<Integer>> subsets(int[] nums) {
int size = nums.length;
int n = 1 << size; //因为每一个数字都有选或者不选的机会那么 子集的个数
//就是 2*size次方 也就是1<<size左移的过程
List<List<Integer>> res = new ArrayList<>();
for (int i = 0; i < n; i++) { //记录结果
List<Integer> cur = new ArrayList<>();//即将要放入的结果
for (int j = 0; j < size; j++) {//我们每次检查 i中 二进制表示中
//数字为1的时候我们就把相对应的位置j放进我们的cur中去
if (((i >> j) & 1) == 1) {//i>>j右移j位 然后&1检查第j位原本是否为1
cur.add(nums[j]);
}
}
res.add(cur);
}
return res;
}
汉明码距离
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
注意:
0 ≤ x, y < 231.
示例:
输入: x = 1, y = 4
输出: 2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
class Solution {
public int hammingDistance(int x, int y) {
int u = x^y;//二进制中相同为0 不同为1
int count =0;
while(u!=0) //计算u中1的个数问题
{
count++;
u=u&(u-1);
}
return count;
}
}
0-n中缺失的数值
依然是利用了异或的性质 既然找0-n中缺失的数值
那我们 就创建一个0-n的数组 和缺失的数组 让他们的所有元素都异或那么最后的结果一定是那一个缺失的元素
A^A=0
0^A =A
而且满足交换律和结合律
class Solution {
public int missingNumber(int[] a) {
int n = a.length;
int res =0;
for (int i = 0; i < a.length; i++) {
res = res^a[i]^i;
}
return res^n;
}
}
判断一个数字是否为2的幂次
我们可以看出 1>1,10>2 ,100>4,1000>8 满足这种条件的
也就是说 n-1>011111111这种形式
class Solution {
public boolean isPowerOfTwo(int n) {
if(n<=0)
return false;
int u = n-1;
while(u!=0)
{
if((u&1)!=1)//每次查看最后一位是否为1
return false;
u=u>>1; //右移一位
}
return true;
}
}