位运算&&二进制枚举

一、基本位运算

A&B

    同为1才是1。

    通常用于二进制位操作,如一个数&1的结果就是取二进制的最末尾,可以用来判断整数奇偶。

A|B

    有一个是1才是1。

    通常用于二进制定位上的无条件赋值,例如一个数or1的结果就是把二进制最末位强行变成1,若要变成0则减1就可以了,实际意义就是把这个数强行变成最接近的偶数。

A^B

    两数不同才是1。

    通常用于对二进制的特定一位进行取反,可以对两个数进行交换。

    常用性质:A^B^B=A,即B^B=0,可以用作判断一个数出现的次数,0^A=A,并且可以用作字符串的比较。

~运算

    把二进制所有数取反。

    取反,注意的是整数类型有没有符号,如果是无符号整数,那么得到的值为其与上界的差。

位运算简单应用

 

二、简单的二进制枚举

核心思想:利用二进制的1,和0代表选择与不选择。将所有情况罗列开,并一位一位与各种情况进行对比,例如:

for(i=0;i<(1<<n);i++)//n是指集合中的元素的个数,(1<<n)==2^n指的是总共的情况数目
    {
        for(j=0;j<n;j++)//j代表的是每种元素对应的下角标
        {
            if(i&(1<<j))//代表选择
            {
                
            }
            else(i&(1<<j)==0)//代表不选择;
        }
        if(     )//加入题目所给出的条件;
        {
            
        }
    }

三、用异或比较不同(计算机中异或的操作是对于整型的操作,double不可以)

1.比较数的异或。

//此题是找出所有数中数字只出现一次的数
#include <bits/stdc++.h>

using namespace std;

int main()
{
    ios::sync_with_stdio(0);
    int n;
    while(cin >> n)            //共有n个数
    {
        long long ans=0;
        int x;                //x是要输入的数
        for(int i=1;i<=n;i++)
        {
            cin >> x;
            ans=ans^x;        //A^A=0,0^A=A,并且异或具有交换律
        }
        cout << ans << endl;
    }
    return 0;
}

例题:NEFU 1172 Find different 

2.比较字符串的异或。

例题:NEFU    teacher Li

#include<bits/stdc++.h>
using namespace std;
int n, tot=0;
string start, follow;
int main()
{
	while(cin>>n)
	{
		cin>>start;
		for(int i=1; i<n*2-1; i++)
		{
			cin>>follow;
			for(int j=0; j<max(start.size(), follow.size()); j++)
				start[j] ^= follow[j];
		}
		cout<<"Scenario #"<<++tot<<endl<<start<<endl<<endl;
	}
	return 0;
}

典型例题:

NEFU 1205 和为K--二进制枚举          NEFU 1505 陈老师加油-二进制枚举       NEFU 1652 中美合拍

NEFU 1518 纸牌游戏-二进制-搜索     NEFU 1285 趣味解题          NEFU 1641 权利指数

NEFU 1665 四糸乃买花-二进制枚举       

 

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值