从零开始备战蓝桥杯——一天一个小算法4(位运算&篇)

位运算是算法中技巧较多的一个篇章,我将在本篇文章中列举一部分较为重要的内容。

首先我们先申明一个概念在计算机中1大多代表存在的意思,于是我们可以定义一个二进制数为(1001),而它所对应的集合为{0,3}。

先从位运算 几个较为重要的标识符开始。

& 表示按位与,∣ 表示按位或,⊕ 表示按位异或

&运算

&的定义

&是位运算符,用于对两个二进制数的对应位进行逻辑与操作。对于每一个位,只有当两个二进制数的对应位都为1时,结果位才为1,否则结果位为0。

以你给出的例子为例,a的二进制数为1101,b的二进制数为0101。进行位与运算,对应位进行逻辑与操作,结果为0101。所以1101 & 0101 = 0101

在数学中,&可以用来表示集合的交集。例如,假设集合A={1, 2, 3, 4},集合B={3, 4, 5},那么A & B表示A和B的交集,即{3, 4}。

{3,2,0}∩{2,0}={2,0}

&的作用

那么&在算题中有哪些重要的作用呢?

如果一个数x是2的幂。

那么

x&(x-1)=0

一个数如果是二进制的幂那么它的二进制表示肯定只有一个1,如下代码推理。

x=10000
x-1=01111
x&(x-1)=0

学会了如何计算2的幂那么去力扣写道题目试一下吧。

2的幂

&计算2的幂。

python代码如下。
class Solution:
    def isPowerOfTwo(self, n: int) -> bool:
        return n > 0 and (n &(n-1)) == 0
c++代码如下:
class Solution {  
public:  
    bool isPowerOfTwo(int n) {  
        return n > 0 && (n & (n - 1)) == 0;  
    }  
};

除了x&(x-1)=0,x&(-x)=x也可以判断x是不是2的幂,推导请自行推导。

&还可以用来计算二进制。

首先我们先来定义>>字符,在二进制中>>表示二进制向右移动一位。例如,在32位整数系统中,如果你有一个二进制数0000 0001 0000 0000(即十进制的16),并对其进行一次右移操作(>> 1),结果将是0000 0000 1000 0000(即十进制的8),因为每一位都向右移动了一位,最左侧的位(即最高位)被丢弃,而在最右侧新增了一位0。

同理<<则是表示二进制向左移动一位。

那么如何表示二进制呢?

二进制的表示。

python代码如下:
n = 12  
ans = ""  
while n:  
    # 检查n的最低位是否为1,如果是,则将'1'添加到ans的开头  
    # 否则添加'0'。但由于我们是从右往左构建字符串,所以直接添加即可。  
    ans += str(n & 1)  
    # 将n右移一位,相当于除以2并取整  
    n >>= 1  
# 打印结果,此时ans是从右往左构建的二进制字符串  
print(ans)

或则用python里面的内置函数。 

n=int(input())
print(bin(n)[2:])

 c++代码如下:

#include <iostream>
#include <string>
using namespace std;
int main() {
    string a="";
    int n ;
    cin>>n;
     while (n) {
        a +=(n & 1)?"1":"0";
        // 右移n以检查下一位
        n >>= 1;
    }
    cout<<a << endl; // 
    return 0;
}

最后再写道题目练练手吧,我们明天再见。

1的个数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值