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);
}
}