c++中位移運算符號 << 與 >>
本文轉載自“shrimp_929”的“C++移位運算符詳解”
聲明
本篇是作為筆記,方便今后查找,因此轉載。
筆者補充
- 位移運算符雖然是基於 “二進制” 進行操作的,但是,在存儲的時候,這些數字依舊是 “整體” 存儲的,也就是說,仍然作為一個整體的十進制數字存起來,不會將他們的每一位分別存儲,更不會區別對待。
- 位移運算符的優先級要小於 算術運算符 ,因此
1 << 3 -1; //表示:1向左位移 **2** 個位置
(1 << 3) - 1; // 表示:1向左位移 3 個位置,然后再減一
- 統計十進制數字,化為二進制后包含多少個 \(1\) 的c++內置函數
#include <cstdio>
__builtin_popcount(i); // 返回 數字 i 中二進制時候 1 的個數
// ! 注意,builtin 前面有兩個下划線
- 推薦一道二進制位運算的好題:洛谷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
}