c++ 中位移運算符 << 和 >> 詳解 與 算法競賽中二進制的應用


c++中位移運算符號 << 與 >>

本文轉載自“shrimp_929”的“C++移位運算符詳解

聲明
本篇是作為筆記,方便今后查找,因此轉載。

筆者補充

  1. 位移運算符雖然是基於 “二進制” 進行操作的,但是,在存儲的時候,這些數字依舊是 “整體” 存儲的,也就是說,仍然作為一個整體的十進制數字存起來,不會將他們的每一位分別存儲,更不會區別對待。
  2. 位移運算符的優先級要小於 算術運算符 ,因此
1 << 3 -1; //表示:1向左位移 **2** 個位置
(1 << 3) - 1; // 表示:1向左位移 3 個位置,然后再減一
  1. 統計十進制數字,化為二進制后包含多少個 \(1\) 的c++內置函數
#include <cstdio>
__builtin_popcount(i); // 返回 數字 i 中二進制時候 1 的個數
					   // ! 注意,builtin 前面有兩個下划線
  1. 推薦一道二進制位運算的好題:洛谷P1036

原文

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

左移運算符<<:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM