算法很美

将整数的二进制奇偶位互换

2019-12-14  本文已影响0人  FiveZM

/*
将一个整数的奇偶位互换
例如输入整数9,二进制表示形式为1001
互换后的结果为0110

    神奇的算法:
    知识点一: 位运算中,1与一个数字进行与运算等于该数字,其实这是一种保留数字的运算
    例如 1 和0进行与运算,结果是0自己
    1和 1进行与运算,结果也是1自己,那么1和任何数进行与运算其实是一种保留的运算

    知识点二:位运算中,0与一个数字进行与运算,等于0,其实这是一种舍弃数字的运算
    例如 0 和 0进行与运算,结果是0
    0和1进行与运算,结果还是0,已经舍弃了1,

    算法核心:将目标整数,假设是9,即1001
    第一步:先将...00001001与运算它01010101010101...一共32位,因为int占4个字节,一个字节8位,
    这里的010101位偶数位是1
    结果是 1001
          &0101
          -----
           0001  -----记录为 ou
   第二步:再将1001与101010......1010进行与运算,这里的1010位奇数为是1
   结果是 1001
         &1010
         -----
          1000   -----记录为 ji
    第三步:将ou 左移一位,将ji右移一位
    再进行异或运算,结果为交换奇偶位
    0001  ---ou左移得到0010
    1000  ---ji右移得到0100
    进行异或运算  0010
                 ^0100
                 -----
                  0110  ------结果

    知识点三:
    01010101....0101 可用 0x55555555 表示
    因为 是 32位 ,即0101 0101 0101 0101 0101 0101 0101 0101
    每一个4位可以用一个16进制表示,而0101 是5
    所以有8个5 , 即0x55555555
    010101010....0101 可用 0x55555555 表示

    同理1010 等于10 ,10用16进制表示是a
    10101010....1010 可用0xaaaaaaaa表示
 */
import java.util.Scanner;

public class 将整数的二进制奇偶位互换 {
   //测试输入9,二进制位1001, 输出6 二进制位110,110前面的0被省略了
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String s = Integer.toBinaryString(n);
        System.out.println(s);

        int ji = n&0xaaaaaaaa; //101010....
        int ou = n&0x55555555; //010101...
        int result = (ou<<1)^(ji>>1);
        System.out.println(result);
        System.out.println(Integer.toBinaryString(result));

    }
}

上一篇下一篇

猜你喜欢

热点阅读