zoukankan      html  css  js  c++  java
  • VIJOS-P1201 高低位交换

    洛谷 P1100 高低位交换

    https://www.luogu.org/problemnew/show/P1100

    JDOJ 1349: VIJOS-P1201 高低位交换

    https://neooj.com:8082/oldoj/problem.php?id=1349

    Description

    给出一个小于2^32的正整数。这个数可以用一个32位的二进制数表示(不足32位用0补足)。我们称这个二进制数的前16位为“高位”,后16位为“低位”。将它的高低位交换,我们可以得到一个新的数。试问这个新的数是多少(用十进制表示)。         例如,数1314520用二进制表示为0000  0000  0001  0100  0000  1110  1101  1000(添加了11个前导0补足为32位),其中前16位为高位,即0000  0000  0001  0100;后16位为低位,即0000  1110  1101  1000。将它的高低位进行交换,我们得到了一个新的二进制数0000  1110  1101  1000  0000  0000  0001  0100。它即是十进制的249036820。

    Input

    一个小于2^32的正整数

    Output

    将新的数输出

    Sample Input

    1314520

    Sample Output

    249036820 
     
    一开始的思路:
    输入十进制,开long long,转二进制。
    二进制分别取前16位和后十六位。
    交换构成新数。
    转回十进制。
     
    以上是纯模拟打法,然而我好像忘了进制转换怎么搞了。
     
    所以想到了位运算。
    所谓位运算就是计算机基于二进制基础上的一种数的转换,针对于十进制数可能理解起来比较困难,但是原理是和我们正常做的四则混合运算等一模一样的,可以找一找位运算的相关知识。
     
    分析这道题:
    我们知道,int的最大存储量只能有2^31-1,为什么呢?因为int有符号位,占了一个数位。你如果因为这个开long long 并不是很明智,因为有的时候long long 会出一些奇妙的bug,所以我们使用unsigned int,没有符号位,完全符合需求。
    然后我们考虑位运算。
    位运算是基于二进制基础上的,也就是在进行位运算的过程中,你传进去的十进制数已经变成了二进制,你只需要尽情操作就可以了。
    多么美妙啊!省了进制转换。
    然后左移十六位,整没了高位。
    右移十六位,整没了低位。
    这个时候得到的两个数正好是相反的。我们再给它抑或回来。
    就顺利的得到了新数。
    因为是位运算,输出也省去了进制转换,美滋滋。
     
    代码:
    #include<cstdio>
    using namespace std;
    unsigned int n;
    int main()
    {
        scanf("%u",&n);
        printf("%u",(n<<16^n>>16));
        return 0;
    }
  • 相关阅读:
    Day15模块(导入,使用)
    day14 迭代器,生成器,函数的递归调用
    Day13有参装饰器,三元表达式,匿名函数
    re模块
    Day12装饰器
    subprocess模块windows系统命令和linux系统命令
    Day11名称空间,作用域,闭包函数
    识别 Linux上的设备(磁盘)类型
    Linux lsblk和df命令区别
    Linux远程拷贝scp
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11220292.html
Copyright © 2011-2022 走看看