相信學過c語言的小夥伴們都知道位操作符,正確的使用位操作符會讓我們寫出更高效率的程式
但不要忘記它也是有缺點的:只能用於整型和字元型資料。
速度:快於乘法 等同於加減法
*參與運算的資料以補碼形式出現!(不要弄錯啦!)
eg: 數字 -1
原碼:10000000 00000000 00000000 00000001
反碼:11111111 11111111 11111111 11111110
補碼:11111111 11111111 11111111 11111111
***有符號數隻改變量值部分 不改變符號位...
=== & 運算 ===
&運算通常用於二進位制數取位操作!
乙個數 & 1的結果就是取乙個數二進位制位的最末位
這可以用來判斷乙個整數的奇偶
eg: 0&1=0;
2&1=0;//注意此時只是取出2進製位的最末位!
=== | 運算 ===
| 運算通常用於二進位制特定位上的無條件賦值
乙個數 | 1的結果就是把二進位制最末位強行變成1,
如果需要把二進位制最末位變成0,對這個數 | 1 後再減一就可以了,
其實際意義就是把這個數強行變成最接近的偶數。
=== 3. ^ 運算 ===
按位 ^ 運算
^ 運算的逆運算是它本身,也就是說兩次異或同乙個數最後結果不變,即(a ^ b) ^ b = a;
^ 運算可以用於簡單的加密
void swap(int a,int b);
此時我們就可以實現簡單的交換啦!是不是很簡單呢!
=== ~運算 ===
~ 運算的定義是把記憶體中的0和1全部取反。使用 ~ 運算時要格外小心,你需要注意整數型別有沒有符號。
如果 ~ 的物件是無符號整數,那麼得到的值就是它與該型別上界的差!
#include#includeint main()
=== << 運算 ===
a << b就表示把a轉為二進位制後左移b位(在後面添b個0)。
eg: 100的二進位制為1100100,而110010000轉成十進位制是400,
那麼100 >> 2 = 400。
a << b的值實際上就是a乘以2的b次方
通常認為a << 1比a * 2更快
因此程式中乘以2的操作請盡量用左移一位來代替。
定義一些常量可能會用到 << 運算。你可以方便地用1 << 16 - 1來表示65535。(2^16 -1);
很多演算法和資料結構要求資料規模必須是2的冪,此時可以用 << 來定義max_n等常量。
=== >>運算 ===
a >> b表示二進位制右移b位(去掉末b位),相當於a除以2的b次方(取整)。
我們也經常用》 1來代替/ 2,
比如折中查詢 、堆的插入操作等等。
>>代替除法運算可以使程式效率大大提高。
最大公約數的二進位制演算法用除以2操作來代替慢得出奇的mod運算,效率可以提高60%。
c語言操作符 位操作符 移位操作符
1 按位操作符 1.1 按位 與 雙目運算子 僅當兩個運算元都為1時,結果為1,否則為0。參與運算的數以補碼方式出現。例 9 5 1 0000 1001 9的補碼 0000 0101 5的補碼 0000 0001 1的補碼 應用 a 通常將某些位清零或保留某些位。例如 將a的高八位清零,保留低八位,...
位運算操作符
與運算,二元操作符,對兩個操作員的每個二進位制位進行與運算,運算規則為 1 1 1 1 0 0 0 1 0 0 0 0 異或運算,二元操作符,對兩個操作員的每個二進位制位進行異或運算,運算規則為 1 1 0 1 0 1 0 1 1 0 0 0 或運算,二元操作符,對兩個操作員的每個二進位制位或運算,...
c 位操作符
我們知道,任何資訊在計算機中都是以二進位制的形式儲存的。位操作符就是對資料按二進位制進行運算的操作符。c 語言中的位操作符有 與 或 異或 取補 左移 右移 其中,取補只有乙個運算元,而其它的位操作符都有兩個運算元。這些運算都不會產生溢位。位操作符的運算元為整型或者是可以轉換為整型的任何其它型別。與...