<< 左移操作符(左邊拋棄、右邊補0)
左移時邏輯移位和算術移位相同。
>> 右移操作符
邏輯移位:左邊用0填充
算術移位:左邊用原該值的符號位填充。
c標準說:
無符號數執行所有移位都是邏輯移位。
但對於有符號的數移位,採用哪種移位方式是根據編譯器決定的。
使用技巧:(偽**呈現)
求二進位制最低位 使用(二進位制數&1)的高效方法
若 x&(x-1) == 0 則 x為2的次方
對於a<<-4這種有歧義的語句盡量不要使用
# include # include # include int main()
//sum += pow((float)2, (31 - b)) * temp; /*cpp中pow函式有型別的問題,所以對pow(x,y)中的x進行型別(double也行)強轉;此外求和還可以利用位運算優化*/
printf("\n");
printf("%u\n", ret); /*一定是無符號輸出 否則會超出有符號的最大值*/
return 0;
}
對於這個例子中 有以下論述:
1 在確定函式原型時 就應該使用無符號型別 否則在輸出中新增
printf("%u\n", ret);
避免產生乙個比較大的負數
2 核心**解釋
a; temp = ((num >> b) & 1);
&:(左值 右值同為1時 結果為1 二進位制位不是1就是0 0&1 = 0;1&1= 1) 1的二進位制編碼為 0000 0000 0000 0000 0000 0000 0000 0001 任何二進位制數字與1,即最低位記錄
結合上文提到的求最低位技巧 在for的每次迴圈中 右移相應的位數 並記錄最低位(臨時記錄)達到從右向左 使用二進位制位的目的
b; ret = ((ret << 1) | temp);
|:(左值 右值有乙個為1時 結果為1 1|1=1 0|1 =1 0|0=0) 將a中臨時記錄的最低位 左移(例如 0001 << 1 = 0010 即右邊補0) 為或a中臨時變數後 達到反轉效果
(例子)偽**如下:
ret = 0
輸入num = 0111 num>>1 = 0011 0011& 0001 = 0001 臨時記錄 temp
ret(初始為0)<<1 = 0 0 | 0001(temp) = 0001(ret 0001)
num>>2=0001 0001 & 0001 = 0001(temp)
ret(0001) << 1 = 0010 0010 | 0001(temp) = 0011
.......
本例四次操作後 num 0111 反轉為 1110
.......
for迴圈 32次結束後 0000 0000 0000 0000 0000 0000 0000 0111 -》 1110 0000 0000 0000 0000 0000 0000 0000
mian over
對位運算 負數字運算的理解
位運算 好 在這裡,我拿洛谷p2104的題當作例題 題目 小z最近學會了二進位制數,他覺得太小的二進位制數太沒意思,於是他想對乙個巨大二進位制數做以下 4 種基礎運算 運算 1 將整個二進位制數加 1 運算 2 將整個二進位制數減 1 運算 3 將整個二進位制數乘 2 運算 4 將整個二進位制數整除...
有序集合間的對位運算
摘要 兩個有序集合之間可能進行一一對應的計算,比如兩個集合如何比較大小,怎樣判斷集合是否相等?如何簡便快捷的處理集合間的對位運算,這裡為你全程解析,並提供 esproc 示例 有序集合間的對位運算 有序集合間的對位運算,包括比較運算 等於 和四則運算 本問中討論的集合,都是有序集合,有序集合的成員是...
js獲得頁面中的絕對位置
size small textrectangle物件,對getclientrects和getboundingclientrect可以得到乙個更好的說明.getclientrects 返回乙個textrectangle集合,就是textrectanglelist物件。getboundingclient...