位操作
移位運算
移位操作只是簡單地把一個值的位向左或向右移動。
移位操作符
右移位操作符 >>
左移位操作符 <<
左移位
在左移位中,值最左邊的幾位被丟棄,右邊多出來的幾個空位則由0補齊。下面是一個左移位例子。
對于一個數n,左移4位,n<<4。
當n=7時,二進制表示? ? ? ?0000 0111
向左移動4位,空位補0? ? ? 0111 0000 (十進制為112)
當n=-7時,二進制表示? ? ? 1000 0111
向左移動4位,空位補0? ? ? 1111 0000? (第一位為符號位,不變,十進制為-112)
當n=-1時,二進制表示? ? ? 1000 0001
向左移動4位,空位補0? ? ? 1001 0000? (第一位為符號位,不變,十進制為-16)
因此左移位時不管是整數還是負數,右邊移入的位用0填充,稱為邏輯移位。
右移位
???????右移位有兩種情況,一種是跟左移位相同的邏輯移位,即左邊移入的位用0填充;另一種是算術移位,左邊移入的位由原先該值的符號位決定,符號位為1,則移入的位均為1,符號位為0則移入的位均為0。
下面是右移位的例子
對于一個數n,右移4位,n>>4。
當n=7時,二進制表示為? ? ? ? ? ?0000 0111
向右移動4位,空位補0(符號位為0) 0000 0000(十進制為0)
當n=16時,二進制為? ? ? ? 0001 0000
向右移動4位,空位補0? ? ?0000 0001(十進制為1)
當n為負數時,此時向右移位不是簡單的將負數的二進制為向右移動,而是將負數存儲于內存中的補碼向右移動??聪旅娴睦?#xff1a;
當n=-1時,二進制表示為? ? ? ? 1000 0001
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 補碼為? ? ? ?1111 1111
? ? ? ? 右移四位再補四位后? ? ? ?1111 1111(還是-1的補碼)
當n=-2時,二進制表示為? ? ? ? ?1000 0010
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?補碼為? ? ? ? ?1111 1110
? ? ? ? ? ? ? ? ? ? ? ? ? 右移四位? ? ? ? 1111 1111(-1的補碼)
當n=-16時,二進制表示為? ? ? ?1001 0000
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 補碼為? ? ? ? 1111 1111
? ? ? ? ? ? ? ? ? ? ? ? ? 右移四位? ? ? ? ?1111 1111(-1的補碼)?
當n=-32時,二進制表示為? ? ? ? 1010 0000
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 補碼為? ? ? ? ?1110 0000
? ? ? ? ? ? ? ? ? ? ? ? ? ?右移四位? ? ? ? ?1111 1110(此時為-2的補碼)
注意類似這種形式的移位:
a<<-5
???????左移-5位表示什么呢?是表示右移5位嗎?還是根本不移位?在某臺機器上,這個表達式實際執行左移27位的操作。當移位的位數比操作數的位數還要多時,這種行為是未定義的。
位操作 位操作由三個操作符&、|、^,分別對它們的操作數的各個位執行AND、OR和XOR(異或)等邏輯操作。- 當兩個位進行AND 操作時,如果兩個位都是1,結果為1,否則結果為0。
- 當兩個位進行OR操作時,如果兩個位都是0,結果為0,否則結果為1。
- 當兩個位進行XOR操作時,如果兩個位不同,結果為1,如果兩個位相同,結果為0。
總結
- 上一篇: sdoi2017苹果树
- 下一篇: hovm什么意思_小火枪的微博 - 水晶