2020蓝桥杯备战–>位运算技巧
题目(2):二进制奇偶位互换
输入一个数,输出这个数二进制表示的奇偶位互换之后的十进制数(相邻两个位互换,之后下一对互换)
例: 1001->0110 01001010->10000101
思路:
第一步分别取出奇数偶数位;
第二步将取出的奇偶位数错位
第三步:错位后相与
原理:
奇位起始 | - | x | - | x | - | x | - | x |
---|
奇取位码 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
奇取出码 a | 0 | x | 0 | x | 0 | x | 0 | x |
偶位起始 | y | - | y | - | y | - | y | - |
---|
偶取位码 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
偶取出码 b | y | 0 | y | 0 | y | 0 | y | 0 |
需要交换yx那么需要 (a<<1)^( b>>1)
例:
输入一个数n= 9—>1001
清零取位要用与
首先从左往右取出偶数位
n的二进制位 | 1 | 0 | 0 | 1 |
---|
取出偶数位 | 1 | 0 | 1 | 0 |
相与得到a | 1 | 0 | 0 | 0 |
同理取出奇数位(从右往左)
n的二进制位 | 1 | 0 | 0 | 1 |
---|
取出偶数位 | 0 | 1 | 0 | 1 |
相与得到b | 0 | 0 | 0 | 1 |
即最终答案转化为十进制为6
代码如下:
public class Main
{
public static void main(String[] ars)
{
int n=9;
int a=n&0xaaaaaaaa;
int b=n&0x55555555;
int n0=(a>>1)^(b<<1);
System.out.print(n0);
}
}