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