目录
零、写在前面
本章主要描述了,简单的位与运算
一、知识点
1.位于运算是一个二元运算符x&y
左操作数 | 右操作数 | 结果 |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
就是有‘0‘结果就是’0‘
2. ..........
亲,请看上文链接哦!
二、课后习题
191.位1的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。
思路:按照2的幂的思路,每次位与会消去末尾最后一位的1(减1嘛),直到位与之后为0
int hammingWeight(uint32_t n) {
int ans=0;
while(n){
n&=(n-1);
ans++;
}
return ans;
}
剑指Offer 15.二进制中1的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为 汉明重量).)。
思路;同上
int hammingWeight(uint32_t n) {
int ans=0;
while(n){
n&=(n-1);
ans++;
}
return ans;
}
1356.根据数字二进制下1数目排序
给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。
请你返回排序后的数组。
思路:先算2进制1的个数
然后直接qsort排序
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int sum(int n) { //计算2进制的1的个数
int ans=0;
while(n){
n&=(n-1);
ans++;
}
return ans;
}
int cmp(const int*a,const int*b){
if(sum(*(int*)a)==sum(*(int*)b)){ //为qsort设计cmp,把那个数用sum算一下比大小
//俩数一一边多的时候就直接比数的大小
return *(int*)a-*(int*)b;
}
return sum(*(int*)a)-sum(*(int*)b);
}
//
int* sortByBits(int* arr, int arrSize, int* returnSize){
qsort(arr,arrSize,sizeof(int),cmp); //直接排
*returnSize=arrSize; //返回长度
return arr; //返回结果
}