位运算:将整数的奇偶位互换

1、知识点(java位运算相关知识总结

1、&运算
整数 & 1:保留
整数 & 0:消除


2、二进制转十六进制
从小数点开始,分别向左、右按4位分组转换成对应的十六进制数字字符,最后不满4位的,则需补0。
例如:
二进制:1010
十六进制:a
编程语言表示:(十六进制前需加0x)
0000 0000 0000 0000 0000 0000 0000 1010
十六进制:0x0000000a

2、解题思路

1、将整数换成二进制形式
2、若将整数与10101010101010101010101010101010做&运算,(若从左往右数,则是保留奇数位;若是从右往左数则是保留偶数位),但都可得如下形式y0y0y0y0y0…y0y0y0的二进制数,y表示该二进制位原数。
3、若将整数与01010101010101010101010101010101做&运算,(若从左往右数,则是保留奇数位;若是从右往左数则是保留偶数位),但都可得如下形式0x0x0x0x…0x0x0x的二进制数,x表示该二进制位原数。
4、原数为xyxyxyxy…xyxyxy,那么变换后需为:yxyxyxyx…yxyxyx。很明显在第2第3步得到的二进制数需做如下操作即可满足变换需求:
        y0y0y0y0…y0y0y0>>1
^      0x0x0x0x…0x0x0x<<1


变换后为:
       0y0y0y0y…0y0y0y

^     x0x0x0x0…x0x0x0

=     xyxyxyxy…xyxyxy

3、java代码

package lanqiao;

import java.util.Scanner;

public class test0106 {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int m = sc.nextInt();
		int a = m & 0xaaaaaaaa; //得到y0y0y0y0...y0y0y0(此处转换为16进制,二进制需写32位太麻烦,下同)                      
		int b = m & 0x55555555; //得到0x0x0x0x...0x0x0x
		int n = (a >> 1) ^ (b << 1); 
		System.out.print(n);
	}
}

发布了15 篇原创文章 · 获赞 6 · 访问量 1056

猜你喜欢

转载自blog.csdn.net/qq_40306266/article/details/104051619