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

  • 相关阅读:
    windows中dos命令指南
    HDU 2084 数塔 (dp)
    HDU 1176 免费馅饼 (dp)
    HDU 1004 Let the Balloon Rise (map)
    变态杀人狂 (数学)
    HDU 2717 Catch That Cow (深搜)
    HDU 1234 开门人和关门人 (模拟)
    HDU 1070 Milk (模拟)
    HDU 1175 连连看 (深搜+剪枝)
    HDU 1159 Common Subsequence (dp)
  • 原文地址:https://www.cnblogs.com/shrimp-can/p/5145351.html
Copyright © 2011-2022 走看看