[万人千题] 《算法零基础100讲》(第42讲) 位运算 (位与) 入门(C语言)

目录

零、写在前面

一、知识点

二、课后习题

191.位1的个数

剑指Offer 15.二进制中1的个数

1356.根据数字二进制下1数目排序


零、写在前面

本章主要描述了,简单的位与运算

《算法零基础100讲》(第42讲) 位运算 (位与) 入门_英雄哪里出来-CSDN博客位运算位与的初步入门[万人千题] 《算法零基础100讲》(第42讲) 位运算 (位与) 入门(C语言)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的个数

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的个数

 剑指 Offer 15. 二进制中1的个数

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为 汉明重量).)。

思路;同上

int hammingWeight(uint32_t n) {
    int ans=0;
    while(n){
        n&=(n-1);
        ans++;
    }
    return ans;
}

1356.根据数字二进制下1数目排序

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;  //返回结果
}

上一篇:PrimerC 第三章 42 页 C语言基本数据类型


下一篇:leaflet实现撒点图(仿echarts)(leaflet篇.42)