目录
传送门
知识点
位或运算符 | (a | b)
运算规则
1|1=1;1|0=1;0|1=1;0|0=0 (即有1就是1,否则为0)
例如:
3 | 7 = 0000 0011 8 | 7 = 0000 1000
| 0000 0111 | 0000 0111
= 0000 0111 = 0000 1111
设置标记位
例:将一个数x二进制下的第5位置为 1
x = x | (0b10000);
置空标记位
例:将一个数x二进制下的第五位置为 0
int a = 0b10000; x = (x | a) - a );
课后习题
231.2 的幂
231. 2 的幂https://leetcode-cn.com/problems/power-of-two/
题目描述:
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。
思路:判断 x|(x-1) == 2*x-1
因为一个数 K 如果为2的幂 则其 K 和 K-1的二进制形式为
K 100…00
K-1 011…11
K | (K-1) 111…11 等于 K+(K-1)
bool isPowerOfTwo(int n){
long N = n; // 2*N会超过int的范围
return N<=0 ? false : (N|(N-1)) == 2*N-1 ? true : false;
}
1356.根据数字二进制下1的数目排序
1356. 根据数字二进制下 1 的数目排序https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits/
题目描述:
给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。
请你返回排序后的数组。
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int count(int x){
int ans = 0;
while(x){
if(x & 1)
++ans;
x >>= 1;
}
return ans; //统计 1 的个数
}
int cmp(const void *a,const void *b){
int na = count(*(int*)a),nb = count(*(int*)b);
if(na != nb)
return na > nb; // 先按 1 的个数排序
else
return *(int*)a > *(int*)b; // 再按 大小排序
}
int* sortByBits(int* arr, int arrSize, int* returnSize){
qsort(arr,arrSize,sizeof(int),cmp);
*returnSize = arrSize;
return arr;
}
762. 二进制表示中质数个计算置位
题目描述:
给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数的整数个数。
(注意,计算置位代表二进制表示中1的个数。例如 21 的二进制表示 10101 有 3 个计算置位。还有,1 不是质数。)
bool isprime(int x){
if(x <= 1)
return false;
int i;
for(i=2;i*i<=x;++i)
if(x % i == 0)
return false;
return true;
}
int count(int x){
int ans = 0;
while(x){
if(x & 1)
++ans;
x >>= 1;
}
return ans; //统计 1 的个数
}
int countPrimeSetBits(int left, int right){
int ans = 0;
while(left <= right){
if(isprime(count(left)))
++ans;
++left;
}
return ans;
}