算法 - 位运算

本文介绍了如何使用位运算n>>k&1获取整数n的二进制表示中第k位,以及利用x&-x或x&(-x+1)获取最右一位1的应用。通过实例展示了如何用C++实现并演示了这两个技巧在统计1的个数中的应用。
摘要由CSDN通过智能技术生成

当我翻博客时发现前面的题目没有题目链接实在是太伤了,从这篇开始加题目链接,之前的有时间就补上。

这节主要介绍两种常用的位运算操作:

  • 一个整数n的二进制表示中第k位是什么:n >> k & 1
  • 返回整数x的二进制表示的最右一位1:x & -xx & (-x + 1)

1 整数n的二进制表示的第k位

首先约定个位是第0位,找到第k位需要两步:

  • 先把第k位移到最右一位即n >> k
  • &1

合一起就是 n >> k & 1
引申应用:返回某一个数的二进制表示(即依次输出各个位)

#include<iostream>

using namespace std;

int main(){
    int n = 15;
    for(int k = 3; k >= 0; k --) cout << (n >> k & 1);
    return 0;
}

上面代码运行的结果是:1111

2 返回最右一位1

返回最右一位1的操作我们通常会定义 lowbit() 函数去实现,这个函数是树状数组的基本操作。(假装懂了
举个例子:lowbit(1010) = 10; lowbit(101000) = 1000
实现方法:x & (-x + 1) 或者 x & -x 都可以。
x & (-x + 1)就是原码和补码相与的结果。
eg.101000

  • 原码:101000
  • 补码:011000
  • 相与:001000

最简单的应用:统计1的个数

int lowbit(int x){
	return x & -x;
}

//main
int res = 0;
while(x){
	x -= lowbit(x);
	res ++;
}

题目链接:https://www.acwing.com/problem/content/803/
代码:

#include<iostream>

using namespace std;

const int N = 100010;

int lowbit(int x){
    return x & (-x);
}
int main(){
    int n;
    cin >> n;

    while(n --){
        int x;
        int res = 0;
        scanf("%d", &x);
        while(x){
            x -= lowbit(x);
            res ++;
        }
        printf("%d ", res);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值