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;
    }
  • 相关阅读:
    MQTT TLS 加密传输
    python多进程并发redis
    各种消息队列的特点
    mqtt异步publish方法
    Numpy API Analysis
    Karma install steps for unit test of Angular JS app
    reinstall bower command
    Simulate getter in JavaScript by valueOf and toString method
    How to: Raise and Consume Events
    获取对象的类型信息 (JavaScript)
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11220292.html
Copyright © 2011-2022 走看看