zoukankan      html  css  js  c++  java
  • 一段计算rotateLeft的代码

    这个链接下的这个回答:

    int rotateLeft(int x, int n) {
        return (x << n) | (x >> (0x1F & (32 + ~n + 1))) & ~(0xFFFFFFFF << n);
    }
    
    //test program
    int main(void){
        printf("%x
    ",rotateLeft(0x87654321,4));
        printf("%x
    ",rotateLeft(0x87654321,8));
        printf("%x
    ",rotateLeft(0x80000000,1));
        printf("%x
    ",rotateLeft(0x78123456,4));
        printf("%x
    ",rotateLeft(0xFFFFFFFF,4));
        return 0;
    }
    

    它是怎么work的呢?

    x<<n没什么好说的, (x >> (0x1F & (32 + ~n + 1)))
    32+~n+1等价于32-n. 为什么? a+~n+1=a+2^32-n-1+1=a-n. 所以不仅是对32成立.
    &0x1f, 其实是在取最低5位. 这是因为n未必在0到31的范围内.
    ~(0xFFFFFFFF << n), 保证只有最低n位不为0, 不可缺少. 这样>>是算术位移还是逻辑位移都不重要了, 我觉得对于无符号右移(逻辑右移)其实是不必要的, 但是这样写就不用担心是无符号数还是符号数了.

  • 相关阅读:
    重排序
    线程的生命周期状态
    并发的有序性
    并发的可见性
    并发的原子性
    Java内存模型
    缓存一致性协议MESI
    lsof
    nmap
    elastcisearch简介
  • 原文地址:https://www.cnblogs.com/Tokubara/p/15104557.html
Copyright © 2011-2022 走看看