《算法零基础100讲》(第48讲) 位运算 (左移)【题解】

目录

传送门

知识点

习题

190.颠倒二进制位

231. 2的幂

476. 数字的补数

338. 比特位计数


传送门

《算法零基础100讲》(第48讲) 位运算 (左移)_英雄哪里出来-CSDN博客左移运算符,代替求幂操作https://blog.csdn.net/WhereIsHeroFrom/article/details/121760206

知识点

位左移运算

运算符  <<      需要移位的数字 << 移位的次数  例如 a << 1        

运算规则:

按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零

 左位移多少位,其实可以实现 乘以2的多少次方   x << y      即 x * 2^{y}

习题

190.颠倒二进制位

190. 颠倒二进制位icon-default.png?t=LA92https://leetcode-cn.com/problems/reverse-bits/

 题目描述:

颠倒给定的 32 位无符号整数的二进制位。

提示:

请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在 示例 2 中,输入表示

int GetBit(int x,int i){
    return (x>>i) & 1;
}
void SetBit(int *x,int i,int v){
    *x |= ((long)v<<i); 
}
uint32_t reverseBits(uint32_t n) {
    uint32_t ret = 0;
    int i;
    for(i=0; i<=31; ++i){
        int v = GetBit(n,31-i);       //颠倒过来取位
        SetBit(&ret,i,v);             //设定位
    }
    return ret;
}

231. 2的幂

231. 2 的幂icon-default.png?t=LA92https://leetcode-cn.com/problems/power-of-two/

题目描述:

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

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

bool isPowerOfTwo(int n){
    if(n <= 0) 
        return false;
    int i;
    for(i=0; i<=31; ++i){
        if((unsigned)1 << i == n)   // 整数范围内 2的幂就31个,利用位移一个个判断
            return true;
    }
    return false;
}

476. 数字的补数

476. 数字的补数icon-default.png?t=LA92https://leetcode-cn.com/problems/number-complement/

 题目描述:

对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。

例如,整数 5 的二进制表示是 "101" ,取反后得到 "010" ,再转回十进制表示得到补数 2 。
给你一个整数 num ,输出它的补数。

int findComplement(int num){
    int i,t=0;
    for(i=0; i<=30; ++i){
        if((int)(pow(2,i)+0.5) > num)
            break;
        num = (num) ^ ((unsigned)1<<i);
    }
    return num;
}

338. 比特位计数


338. 比特位计数icon-default.png?t=LA92https://leetcode-cn.com/problems/counting-bits/

 题目描述:

给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int countBit(int x){
    int i,cnt = 0;
    for(i=0; i<=31; ++i){
        if((unsigned)1<<i & x)      //依次位移判断该位是否为1
            ++cnt;
    }
    return cnt;
}
int* countBits(int n, int* returnSize){
    int *nums = (int*)malloc(sizeof(int)*(n+1));
    int i;
    for(i=0; i<=n; ++i)
        nums[i] = countBit(i);
    *returnSize = n+1;
    return nums;
}

 

 

 

         

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

周日加一

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

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

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

打赏作者

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

抵扣说明:

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

余额充值