[解题报告]《算法零基础100讲》(第49讲) 位运算 (右移)

简介: [解题报告]《算法零基础100讲》(第49讲) 位运算 (右移)

☘前言☘

今天是算法零基础打卡的第49天,今天发现个大坑,图片之前没改日期,失误失误-.-开始学习。上链接:

《算法零基础100讲》(第49讲) 位运算 (右移)


🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人

✨联系方式:2201891280(QQ)

⏳全文大约阅读时间: 20min


全文目录

 ☘前言☘

 🎁主要知识点

        ✨右移

               📓二进制形态

               📓执行结果

        ✨右移的应用

               📓1.去掉低k位

               📓2.取低位连续1

               📓3.取第k位的值

  📓课后习题

               191. 位1的个数

               231. 2 的幂

               342. 4的幂

               405. 数字转换为十六进制数

 📑写在最后

🎁主要知识点

✨右移

📓二进制形态

x>>y就是把x右移y位 看下面更好理解。

a4fe1feab1b4b68979fd6753774e6d4.png

上面就是对87右移3位的结果


📓执行结果

执行结果其实等价于

4c22a2c920583f25a5245cd2ba4cfd8.png


其中最外围符号代表向下取整。上一条的87/2^3的结果就是10.


✨右移的应用

📓1.去掉低k位

直接运用右移完成。


📓2.取低位连续1

6313aa002e401adb5961f2ed01a78ce.png


将原数字+1

将原本的数字和新得到的数字异或

将得到结果>>1即可

(x^(x+1)) >>1

📓3.取第k位的值

(x>>k) &1


📓课后习题

191. 位1的个数

191. 位1的个数


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

解题思路


利用与运算判断最低位是否为1,然后右移一位直到为0.

int hammingWeight(uint32_t n) {
    int count = 0;
    while(n){
        if(n & 1) count++;  /统计低位1的个数
        n>>=1;
    }
    return count;
}


231. 2 的幂

231. 2 的幂


给你一个整数n,请你判断该整数是否是2的幂次方。如果是,返回 true ;否则,返回false。

如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。


解题思路


如果最低位是0就右移,看最后的结果是不是1就好了。


bool isPowerOfTwo(int n){
    if(n <= 0) return false;
    while(!(n & 1)) //是0就一直右移
        n >>= 1;
    return n == 1;
}

342. 4的幂

342. 4的幂


给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回true;否则,返回 false 。

整数 n 是 4 的幂次方需满足:存在整数x使得 n == 4x


解题思路


和上面差不多,区别是判断条件是3(11)的与结果为0.


bool isPowerOfFour(int n){
    if(n <= 0) return false;
    while(!(n & 3))
        n >>= 2;
    return n == 1;
}

405. 数字转换为十六进制数

405. 数字转换为十六进制数


给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算方法。


解题思路


其实就是四位一组处理一下就好了。然后我们处理的时候是从低位开始的,但是打印的时候要从高位开始,所以用一下栈。


char * toHex(int num){
    char s[16] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
    char *ans = malloc(sizeof(char) * 9);
    int count = 0,stack[8],countnum = 0;
    if(num == 0) ans[count++] = '0';    //0的特殊判定
    unsigned int a = num;
    while(a){ //每四位一组写入栈
        stack[countnum++] = a % 16;
        a >>= 4;    
    }
    while(countnum){  //出栈写入结果
        ans[count++] = s[stack[--countnum]];
    }
    ans[count] = 0;
    return ans;
}


相关文章
|
6月前
|
算法
算法思想总结:位运算
算法思想总结:位运算
|
6月前
|
算法 Java Serverless
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-444 算法训练 求和问题
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-444 算法训练 求和问题
56 1
|
3月前
|
算法
【算法】位运算算法——消失的两个数字(困难)
【算法】位运算算法——消失的两个数字(困难)
|
3月前
|
算法
【算法】位运算算法——只出现一次的数字Ⅱ
【算法】位运算算法——只出现一次的数字Ⅱ
|
3月前
|
算法
【算法】位运算算法——判断字符是否唯一
【算法】位运算算法——判断字符是否唯一
|
1月前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
72 0
|
1月前
|
算法 C++
【算法解题思想】动态规划+深度优先搜索(C/C++)
【算法解题思想】动态规划+深度优先搜索(C/C++)
|
3月前
|
算法
【算法】位运算算法——两整数之和
【算法】位运算算法——两整数之和
|
3月前
|
算法
【算法】位运算算法——丢失的数字
【算法】位运算算法——丢失的数字
|
3月前
|
算法
算法】位运算——常见位运算基础操作总结
算法】位运算——常见位运算基础操作总结
算法】位运算——常见位运算基础操作总结