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

目录

零、写在前面

一、知识点

二、课后习题

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空白-checkmate

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值