美文网首页算法很美
将整数的二进制奇偶位互换

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

作者: FiveZM | 来源:发表于2019-12-14 10:57 被阅读0次

    /*
    将一个整数的奇偶位互换
    例如输入整数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));
    
        }
    }
    
    

    相关文章

      网友评论

        本文标题:将整数的二进制奇偶位互换

        本文链接:https://www.haomeiwen.com/subject/zkjcnctx.html