题目:将整数的二进制形式的奇偶位互换
题目描述:
例如:1001 --> 0110
分析:
(int类型为32位,为描述方便,在此用8位表示)
①保留1001的偶数位,屏蔽奇数位:
00001001 & 10101010 = 00001000
②保留1001的奇数位,屏蔽偶数位:
00001001 & 01010101 = 00000001
③将获取的偶数位向右移一位:
00001000 >> 1 = 00000100
④将获取的奇数位向左移一位:
00000001 << 1 = 00000010
⑤将③④得到的数据相或即可得到结果
00000100 ^ 00000010 = 00000110
Tips:
③④步骤起到交换奇偶位的作用
偶数位:1010 --> 右移一位后变为 0101 -->原本在偶数位的变到奇数位
奇数位:0101 --> 左移一位后变为 1010 -->原本在奇数位的变到偶数位
⑤步骤起到变换奇偶位后,两者进行合并得到结果
代码展示:
import java.util.Scanner;
public class Demo{
public static void main(String[] args) {
//键盘录入一个整数
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数");
int N = sc.nextInt();
//打印该整数的二进制形式
System.out.println(N+"的二进制形式为:"+Integer.toBinaryString(N));
//保留偶数位:将原数与1010···1010(32位)相与,1010用16进制可以表示为A
int ou = N & 0xAAAAAAAA;
//保留奇数位:将原数与0101···0101(32位)相与,0101用16进制可以表示为5
int ji = N & 0x55555555;
//结果
int result = (ou >> 1) | (ji << 1);
//输出
System.out.println(N+"的二进制形式奇偶位互换后变为:"+result);
System.out.println(result+"的二进制形式为:"+Integer.toBinaryString(result));
}
}
结果展示:
骚话时刻:
一时发博一时爽,一直发博一直爽!