目录
零、写在前面
一、知识点
二、课后习题
191.位1的个数
剑指Offer 15.二进制中1的个数
1356.根据数字二进制下1数目排序
本章主要描述了,简单的位与运算
《算法零基础100讲》(第42讲) 位运算 (位与) 入门_英雄哪里出来-CSDN博客位运算位与的初步入门https://blog.csdn.net/WhereIsHeroFrom/article/details/120876417
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; //返回结果 }