對位運算中問題的闡述

2021-06-28 00:08:44 字數 1650 閱讀 1938

<<          左移操作符(左邊拋棄、右邊補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...