c++提供了位運算操作符,使程式可以直接對記憶體進行操作。c++的這個特色大大提高了c++程式的執行能力。例如使用位操作運算可以將乙個儲存單位中的各個二進位制位左移或右移一位,也可以將乙個儲存單位中所有的二進位制位取反,這些操作多數要比直接進行數值上的運算要高效的多。
學習位運算之前,我們先來了解幾個概念:
位元組:位元組是資料儲存和數值計算的基本單位,也是從記憶體讀取資料和寫入資料的最小單位,單位是byte。
位:在作業系統中,位元組還可以劃分為更小的單位——位。乙個位元組由8個位組成,每個位的值為0或1,單位bit。
取反(~):即將1變成0,0變成1,也就是說:
~1=0;
~0=1;
取反就是將乙個數的二進位製碼的補碼取反,正數的補碼是本身,負數的是按位取反加1.
且運算(&):或者叫與運算,基本的位運算子之一。形式為「數值1 & 數值2」,比方說:
1&0=0;
或運算(|):基本的位運算子之一,形式為「數值1|數值2」,比方說:
1|0=1;
移位運算:包括左移運算(<<)和右移運算(>>),形式為「數值1《數值2」(>>同理)表示數值1的全部二進位制位向左(右)移數值2位。
取反訓練:
#include
using
namespace
std;
int main()
移位操作訓練:
由於二進位制各位之間的關係恰位兩倍,左移一位其實可以起到了乘以2的作用,右移一位則可以起到除以2的作用
#include
using
namespace
std;
int main()
計蒜客 單獨的數字(位運算)
給定乙個陣列 a,除了乙個數出現一次之外,其餘數都出現三次。找出出現一次的數。如 找出 7。你的演算法只能是線性時間的複雜度,並且不能使用額外的空間哦 輸入格式 第一行輸入乙個數n 1 n 500 代表陣列的長度。接下來一行輸入 n 個 int 範圍內 2147483648 2147483647 的...
計蒜客 2019計蒜之道D
題意 現在給定你乙個字串 s ss 以及乙個整數 k kk,請求出 s ss的字典序最小的長度為 k kk的子串行。資料範圍 0 s 5000000 00 s 5000 000 樣例輸入 helloworld 5樣例輸出 ellld思路 假如我們先不考慮長度為k的限制我們應當怎麼做?我們以樣例為例子...
計蒜客 泥塑課C
描述 小公尺是乙個幼兒園老師,每學期的泥塑課上,她都會給每個學生發不超過 250 立方厘公尺的等量橡皮泥,教大家做泥塑。在上課過程中,她發現每個班都恰好有乙個小朋友會去搶另乙個小朋友的橡皮泥,於是她決定,在正式開始做泥塑前,讓大家把手裡的橡皮泥都捏成乙個立方體,並且測量手裡捏好的橡皮泥的長 寬和高。...