二进制枚举的一些思考和例题

二进制枚举

固定模板

for (int i=0;i<(1<<n);i++)
for(int j=0;j<n;j++)
if(i&(1<<j))

这样就把所有数遍历了一遍,用1<<去和i与就可以去选其中的某几个数
最后去应用这个方法解决一些问题
我觉得之所以用二进制思想去解决问题是因为二进制表示的一些巧妙的地方,这得慢慢
结合题目去悟

前提是得先学会二进制的一些基本运算法则

算数位运算:
1、与(&):
对于指定的两个数A=60(0011 1100)
B=13(0000 1101)
执行一下操作 A&B=12(0000 1100)
就是对二进制每一位进行了一次与操作,同为1,结果为1,否则为0
其实说白了就是只要有0就是0;
2、或(|):
对于指定的两个数A=60(0011 1100)
B=13(0000 1101)
执行一下操作 A|B=61(0011 1101)
就是对二进制每一位进行了一次或操作,同为0,结果为0,否则为1
说白了就是有1就为1;
关于与和或其实可以类比&& ||
3、非 按位取反(~):
对于指定的一个数A=60(0011 1100)
执行以下操作 ~A=195(1100 0011)
就是对二进制每一位进行了一次取反操作,若二进制数位0,则变成1,否则变成0.
4、异或运算
a,b值不同为1(就是两个数一个1 一个0) 相同时为0;
在c/c++中异或用^符号表示;
就是两个二进制数相加后的结果舍去进位

***任何数合0异或都是本身,对于异或一个非常重要的性质,对于一个值异或同一个值两次,则结果还是原值。

移位操作

移位操作有两种左移与右移:
1、左移<<
例如:A=5(0101)
如果向左移动一位即A<<1结果为1010,十进制的10。二进制中的左移就是乘二操作,在c/c++中左移运算速度比乘二速度要快。
其实就是往后面加多少个0
2、右移>>
例如:A=5(0101)
如果向右移动一位即A>>1结果为0010,十进制的2。二进制中的左移就是除二操作(舍去小数)。

例题

NEFU_OJ 1172

#include <iostream>

using namespace std;

int main()
{
   
    int n,a=0,x;
    while(cin>>n)
    {
   
        a=0;
        for(int i=0;i<n;i++)

            {
   
            cin>>x;
            a=a^x;}
        cout<<a<<endl;
    }
    return 0;
}

NEFU_OJ 1205

#include <iostream>

using namespace std;

int main()
{
   
    int a[30],k,n,flag=0;
    while(cin>>n>>k){
   
    for
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值