2021-01-24

这篇博客总结了蓝桥杯竞赛中如何巧妙运用二进制和位运算解决计算问题,包括计算二进制中1的个数的两种方法,以及互换整数奇偶位的技巧。通过2013年部分真题实例,展示了枚举、全排列、素数判定等解题思路,帮助参赛者提升算法能力。
摘要由CSDN通过智能技术生成

巧妙运用二进制与位运算解决问题:

二进制中1的个数的两种方法:

1,当N某一位上为1时,1左移到该位时的数(1&1为1,1&0为0)刚好等于1<<i,说明有一个1

int count=0;
for (int i =o; i< 32; i++0){
   if((N&(1<<i))==(1<<i)){
   count++;
   }
}
System.out.println( count);

2,当一个二进制数N每减一个1后,右数第一个1变成0后面所有数变成1,当它再与N进行与运算后会消掉后面的1
10100-1=10011,10011&10100=10000 。

count=0;
while (N!=O){
N=((N-1)&N);
count++;
}
System.ourt.println( count);
}

3,当判断整数是不是2的整数倍时,就相当于间接判断二进制里面1的个数是不是一个。

互换整数的奇偶位:

其实也是利用了与&运算与二进制,当一个二进制数&101010101010…相当于取出了偶数位,同理当一个数&010101010101…相当于取出奇数位。代码如下:

private static int m(int i) {
int ou = i&Pxaaaaaaaa;//1010101010....转换成16进制。
int ji = i&Dx55555555;//0101010101....的16进制。
return (ou>>1)^(ji<<1);
}

2013部分真题小结:

猜年龄 ,简单枚举
组素数带重复元素的全排列和素数判定,用到set去重。
马虎的算式, 利用枚举设5个变量,再组合。
第39级台阶,记录走的步数,本质是递归思维。
有理数类面向对象和分数加法。
逆波兰表达式递归的整体思维。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值