目录
传送门
知识点
位左移运算
运算符 << 需要移位的数字 << 移位的次数 例如 a << 1
运算规则:
按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零
左位移多少位,其实可以实现 乘以2的多少次方 x << y 即
习题
190.颠倒二进制位
190. 颠倒二进制位https://leetcode-cn.com/problems/reverse-bits/
题目描述:
颠倒给定的 32 位无符号整数的二进制位。
提示:
请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在 示例 2 中,输入表示
int GetBit(int x,int i){
return (x>>i) & 1;
}
void SetBit(int *x,int i,int v){
*x |= ((long)v<<i);
}
uint32_t reverseBits(uint32_t n) {
uint32_t ret = 0;
int i;
for(i=0; i<=31; ++i){
int v = GetBit(n,31-i); //颠倒过来取位
SetBit(&ret,i,v); //设定位
}
return ret;
}
231. 2的幂
231. 2 的幂https://leetcode-cn.com/problems/power-of-two/
题目描述:
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。
bool isPowerOfTwo(int n){
if(n <= 0)
return false;
int i;
for(i=0; i<=31; ++i){
if((unsigned)1 << i == n) // 整数范围内 2的幂就31个,利用位移一个个判断
return true;
}
return false;
}
476. 数字的补数
476. 数字的补数https://leetcode-cn.com/problems/number-complement/
题目描述:
对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。
例如,整数 5 的二进制表示是 "101" ,取反后得到 "010" ,再转回十进制表示得到补数 2 。
给你一个整数 num ,输出它的补数。
int findComplement(int num){
int i,t=0;
for(i=0; i<=30; ++i){
if((int)(pow(2,i)+0.5) > num)
break;
num = (num) ^ ((unsigned)1<<i);
}
return num;
}
338. 比特位计数
338. 比特位计数https://leetcode-cn.com/problems/counting-bits/
题目描述:
给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int countBit(int x){
int i,cnt = 0;
for(i=0; i<=31; ++i){
if((unsigned)1<<i & x) //依次位移判断该位是否为1
++cnt;
}
return cnt;
}
int* countBits(int n, int* returnSize){
int *nums = (int*)malloc(sizeof(int)*(n+1));
int i;
for(i=0; i<=n; ++i)
nums[i] = countBit(i);
*returnSize = n+1;
return nums;
}