zoukankan      html  css  js  c++  java
  • C++移位运算符详解

    移位运算符包括左移"<<"和右移">>"

    左移运算符<<:

    1.无符号

    语法格式:需要移位的数字<<移位的次数n

    运算规则:按二进制形式把所有数字向左移动相应的位数,高位移出(舍弃),低位的空位补0。相当于乘以2的n次方

    例如:4<<2 ,就是将数字4左移2位

    过程:4的二进制形式:00000000 00000000 00000000 00000100;然后把高位2个0移出,其余所有位向左移动2位,低位补0,得到:00000000 00000000 00000000 00010000;十进制数为16,16=4*22

    C++程序测试:

    #include <iostream>
    #include <bitset>
    using namespace std;
    int main() {
        unsigned short short1 = 4;    
        bitset<16> bitset1{short1};   // the bitset representation of 4
        cout << bitset1 << endl;  // 0000000000000100
    
        unsigned short short2 = short1 << 1;     // 4 left-shifted by 1 = 8
        bitset<16> bitset2{short2};
        cout << bitset2 << endl;  // 0000000000001000
    
        unsigned short short3 = short1 << 2;     // 4 left-shifted by 2 = 16
        bitset<16> bitset3{short3};
        cout << bitset3 << endl;  // 0000000000010000
    }
    

    2.有符号

    如果你左移有符号的数字,以至于符号位受影响,则结果是不确定的。

    C++程序测试:

    #include <iostream>
    #include <bitset>
    using namespace std;
    
    int main() {
        short short1 = 16384;    
        bitset<16> bitset1{short2};
        cout << bitset1 << endl;  // 0100000000000000 
    
        short short3 = short1 << 1;
        bitset<16> bitset3{short3};  // 16384 left-shifted by 1 = -32768
        cout << bitset3 << endl;  // 100000000000000
    
        short short4 = short1 << 14;
        bitset<16> bitset4{short4};  // 4 left-shifted by 14 = 0
        cout << bitset4 << endl;  // 000000000000000  
    }

    右移运算符>>:

    1.无符号

    语法格式:需要移位的数字>>移位的次数n

    运算规则:按二进制形式把所有数字向右移动相应的位数,低位移出(舍弃),高位的空位补0。相当于除以2的n次方

    例如:4>>2 ,就是将数字4左移2位

    过程:4的二进制形式:00000000 00000000 00000000 00000100;然后把低位2个0移出,其余所有位向右移动2位,高位补0,得到:00000000 00000000 00000000 00000001;十进制数为1,1=4÷22

    C++程序测试:

    #include <iostream>
    #include <bitset>
    using namespace std;
    
    int main() {
        unsigned short short11 = 1024;
        bitset<16> bitset11{short11};
        cout << bitset11 << endl;     // 0000010000000000
    
        unsigned short short12 = short11 >> 1;  // 512
        bitset<16> bitset12{short12};
        cout << bitset12 << endl;     // 0000001000000000
    
        unsigned short short13 = short11 >> 10;  // 1
        bitset<16> bitset13{short13};
        cout << bitset13 << endl;     // 0000000000000001
    
        unsigned short short14 = short11 >> 11;  // 0
        bitset<16> bitset14{short14};
        cout << bitset14 << endl;     // 0000000000000000}
    }

    2.有符号

    语法格式:需要移位的数字>>移位的次数n

    运算规则:按二进制形式把所有数字向右移动相应的位数,低位移出(舍弃),正数,高位的空位补0。负数,高位的空位补1.

    C++程序测试:

    正数:

    #include <iostream>
    #include <bitset>
    using namespace std;
    
    int main() {
        short short1 = 1024;
        bitset<16> bitset1{short1};
        cout << bitset1 << endl;     // 0000010000000000
    
        short short2 = short1 >> 1;  // 512
        bitset<16> bitset2{short2};
        cout << bitset2 << endl;     // 0000001000000000
    
        short short3 = short1 >> 11;  // 0
        bitset<16> bitset3{short3};   
        cout << bitset3 << endl;     // 0000000000000000
    }

    负数:
    #include <iostream>
    #include <bitset>
    using namespace std;
    
    int main() {
        short neg1 = -16;
        bitset<16> bn1{neg1};
        cout << bn1 << endl;  // 1111111111110000
    
        short neg2 = neg1 >> 1; // -8
        bitset<16> bn2{neg2};
        cout << bn2 << endl;  // 1111111111111000
    
        short neg3 = neg1 >> 2; // -4
        bitset<16> bn3{neg3};
        cout << bn3 << endl;  // 1111111111111100
    
        short neg4 = neg1 >> 4; // -1
        bitset<16> bn4{neg4};    
        cout << bn4 << endl;  // 1111111111111111
    
        short neg5 = neg1 >> 5; // -1 
        bitset<16> bn5{neg5};    
        cout << bn5 << endl;  // 1111111111111111
    }

     参考:

    http://baike.baidu.com/link?url=N6rRNKFdHoXOqfzDT1vEf1ASgGReSgTEBoBkIzCSCNzKE1gNe8ViDNIWFRbqGqXvMahOPD5o8eifyl3Fhzezwa

    https://msdn.microsoft.com/zh-cn/library/336xbhcz.aspx

  • 相关阅读:
    深度卷积网络中如何进行上采样?
    权重衰减(weight decay), L2正则
    python中的super().__init__()
    随机变量的间独立性及其传播
    卡尔曼滤波、扩展卡尔曼滤波、无迹卡尔曼滤波以及粒子滤波原理
    贝叶斯推断中的后验概率、似然函数、先验概率以及边际似然定义(转)
    详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解(转)
    python告警发微信
    python模块operator操作符函数
    Django之CSRF验证。
  • 原文地址:https://www.cnblogs.com/shrimp-can/p/5145351.html
Copyright © 2011-2022 走看看