题目:
输入一个整数,将整数的二进制数中的奇偶位互换。
例如:
9=1001,奇偶互换为0110=6.
思路:
一个数的二进制,用另外一个类似010101或者101010的二进制数做与运算。(原二进制数,从地位往高位数奇偶。)
与010101做与运算为保留奇数位上的数y。(奇数位上y为1则1&1=0,y为0则0&1=0,还是保留了原位上的0这个数字。)
与101010做与运算为只保留偶数位上的数x。
为了达到奇偶位互换的效果,将只保留了奇位上的数向左移一位(因为其最高位为0,不会溢出。此时两只保留的数x,y;0,0是对齐的)
将只保留了偶位上的数向右移动一位(其最低位为0,不会溢出)。(这样达到了奇偶互换的效果)
再将两数做异或,或者做或运算(因为只保留奇、偶位上的数,不可能有连续的11,)。
废话说了这么多,上代码
代码:
import java.util.*;
public class 奇偶互换 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
System.out.println("输入的数为:"+N);
System.out.println("他的二进制为:"+Integer.toString(N, 2));
//N从低位往高位数奇偶,低位第一位为奇数位
int ji=N&0b01010101_01010101_01010101_01010101;//0b用二进制表示数
System.out.println("只保留奇位后为:"+Integer.toString(ji, 2));
int ou=N&0b10101010_10101010_10101010_10101010;
System.out.println("只保留偶位后为:"+Integer.toString(ou, 2));
int f=(ji<<1)^(ou>>1);//被保留下的奇位左移,被保留下的偶位右移
System.out.println("奇偶互换后为:"+f);
System.out.println("奇偶互换后的二进制表示为:"+Integer.toString(f, 2));
}
}
关键代码:
1.
int ji=N&0b01010101_01010101_01010101_01010101;//被赋值后的int ji,其奇数位上保留了原N奇数位上的数,ji的偶数位上全为0
int ou=N&0b10101010_10101010_10101010_10101010;//同理
int f=(ji<<1)^(ou>>1);//达到奇偶互换的效果
***觉得好用的朋友点个赞!***