位运算&&二进制枚举

版权声明:本文为CSDN博主「nefu_马家沟老三」的原创文章,遵循 CC 4.0 BY-SA 版权协议,本次转载已获得授权。
原文链接:https://blog.csdn.net/acm_durante/article/details/103792952

一、基本位运算

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,并且可以用作字符串的比较。

~运算

把二进制所有数取反。

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

位运算简单应用

位运算的应用与功能
功能 位运算
去掉最后一位 x >> 1
最后加一个0 x << 1
最后加一个1 (x<<1) + 1
把最后一位变成1 x | 1
把最后一位变成0 (x | 1) - 1
最后一位取反 x ^ 1
把右数第k位变成1 x | (1 << (k-1))
把右数第k位变成0 x &~  (1 << (k-1))
右数第k位取反 x ^ (1 << (k-1))
取末三位 x & 7
取末k位 x & ((1<
取右数第k位 x >> (k-1)&1
把末k位变成1 x | ((1<
末k位取反 x ^ ((1>>k)-1)
把右边连续的1变成0 x & (x+1)
把右起第一个0变成1 x | (x+1)
把右边连续的0变成1 x | (x-1)
取右边连续的1 (x^(x+1)) >> 1
去掉右边第一个1 的左边(树状数组) x & (x^ (x-1))

二、简单的二进制枚举

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

for(i=0;i<(1<

三、用异或比较不同

计算机中异或的操作是对于整型的操作,double不可以.。

1.比较数的异或

例题:NEFU 1172 Find different 

//此题是找出所有数中数字只出现一次的数
#include 
 
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;
}

2.比较字符串的异或

例题:NEFU  643 teacher Li

#include
using namespace std;
int n, tot=0;
string start, follow;
int main()
{
	while(cin>>n)
	{
		cin>>start;
		for(int i=1; i>follow;
			for(int j=0; j

典型例题:

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

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

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

版权声明:本文为CSDN博主「nefu_马家沟老三」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/acm_durante/article/details/103792952

 

你可能感兴趣的:(算法类)