1. 程式人生 > 其它 >程式競賽——位運算常用操作

程式競賽——位運算常用操作

位運算

&

|

~

^ 異或

>> 右移

<< 左移

常用操作:

(1) 求x的第k位數字 x >> k & 1

(2) lowbit(x) = x & -x,返回x的最後一位1

求整數的二進位制數表示中的第k位是幾?

n = 15 =(1111)2 :從0位開始的(右到左)

  1. 先把第k位移到最後一位 n >> k (將第k位移到了個位上)
  2. 看個位是幾 x&1

總結:1、2彙總: n >> k & 1

    int n = 10;// 1010
    for(int k = 3;k >= 0; k--)// 4位數的二進位制數
    cout<< (n >> k & 1); // 1010

lowbit(x):返回x的最後一位1

lowbit()函式用來取一個二進位制最低位的1與後邊的0組成的數。

應用:統計x中1的個數(每次把最後一個1去掉)

x = 1010 lowbit(x) = 10

x= 101000 lowbit(x) = 1000

實現原理:x & -x = x & (~x + 1),負數的補碼:原碼取反加一。利用了負整數的補碼特性

【例題】acwing801. 二進位制中1的個數

【方法一】傳統思路:先將十進位制數轉為二進位制數,然後統計出現1的個數(遍歷判斷)

#include<iostream>

using namespace std;
const int N = 100000+10;
int q[N];

// 將十進位制數轉為二進位制數並統計1的個數
int count(int n)
{   int k = 0, ans = 0;
    while(n != 0)
    {
        q[k++] = n % 2;
		n = n / 2;
    }
	for(k--; k >= 0; k--)
	{
		if(q[k] == 1)
		ans++;
	}
	return ans;
}

int main()
{
	int n;
	cin>>n;
	
	while(n--)
	{
	    int x;
		cin>>x;
		cout<<count(x)<<" ";
	}

	return 0;
}

【方法二】位運算

#include<iostream>
using namespace std;

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

int main(){
    int n;
    cin>>n;
    while(n--)
    {
        int x;
        int res = 0;
        cin>>x;
        while(x)
        {
        x -= lowbit(x); // 減去每一次的最後一位1
        res++;
        }
    cout<<res<<" ";
    }
    return 0;
}

總結:

求n的第k位數字: n >> k & 1
返回n的最後一位1:lowbit(x) = x & -x。應用:求某一個數的二進位制有多少位1。

注:如果文章有任何錯誤或不足,請各位大佬盡情指出,評論留言留下您寶貴的建議!如果這篇文章對你有些許幫助,希望可愛親切的您點個贊推薦一手,非常感謝啦