python中的左移右移需要需要一些工具:
bin():轉換為二進位制的函式,比如bin(2)返回值是字串型別的'0b10'。
二進位制在python中的表達是0b開頭的,比如0b10表示的是2的二進位制
但是如果使用type(0b10)發現,0b10本身是int型別的。直接使用0b10
程式也會把它直接替換為2.
python中二進位制的負數表示也很簡單粗暴,比如-0b10表示的是-2.
由於不採用補碼而是直接使用符號位置,所以python中對負數的左右
移操作將不是簡單的補0或者補1.
例子:
bin(-15) # '-0b1111'
bin(-15>>1) # '-0b1000',也就是-8
可以看到,因為不是使用補碼,所以當-0b1111右移1位的時候,它的數值變成了-0b1000.
這樣的情況只發生在最低位是1的情況。事實上,-0b1111>>1的結果剛好是-0b111-1=-0b1000
很有趣,目前沒有得出其他結論。這樣的厲害之處在於,對負數左移的時候不會出現符號躍遷
的問題,比如-0b101左移一位得到-0b1010,這樣使得位移動運算變得安全了起來。
此外,對位運算比較熟悉的朋友應該都知道,-x = ~x + 1
移位操作 邏輯左移 邏輯右移 算術右移
常常會混淆移位操作的概念,因此在這裡記錄下測試程式。public class main 關於二進位制數加減法 原碼 反碼 補碼 正數 原碼就是原始數值的二進位制表示形式,最高位符號位是0 反碼是原碼的按位置取反 補碼是反碼的基礎上 1 負數 原碼就是最高位為1的表示形式 反碼是最高位的符號位不變,其...
c 中的左移 右移運算
今天在看x264的源 時,發現裡面大量應用了 運算子,看書的時候注意過這個細節,不過在工作中一直沒有用到,也沒記住。重新查了k r,裡面說無符號數的移位總是用0填充,而對於有符號數,則與機器的具體實現有關。如果用0填充,那麼這種填充方式稱為 logical shift 若用符號位填充,則稱為 ari...
c 中的左移 右移運算
移位運算包含 邏輯移位 logical shift 和 算術移位 arithmetic shift 邏輯移位 移出去的位丟棄,空缺位 vacant bit 用 0 填充。算術移位 移出去的位丟棄,空缺位 vacant bit 用 符號位 來填充,所以一般用在右移運算中。c 中,整數分有符號數和無符號...