原碼 就是前面所介紹的二進位制定點表示法,即最高位為符號位,「 0 」表示正,「 1 」表示負,其餘位表示數值的大小。
反碼 表示法規定:正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。
補碼 表示法規定:正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加 1 。
補碼是為了表示乙個負數的二進位制形式。
其轉化方式是,先將負數當成正數,轉化成二進位制的形式,再將二進位制正數的各個位上取反,再加上一。
例如-5
先求出5的二進位制數 : 0000 0000 0101
然後將各個位上0變1,1變0 : 1111 1111 1010
最後再加1 : 1111 1111 1011
運算的兩個數,轉換算為二進位制後,進行與(&)運算。
當相應位上的數都是1時,該位取1,否則該為0。
例如5 & -5
5 : 0000 0000 0101
-5 :1111 1111 1011
答案 : 0000 0000 0001
運算的兩個數,轉換為二進位制後,進行或(|)運算。
只要相應位上存在1,那麼該位就取1,如果都不為1,就為0。
還是5 | -5
0000 0000 0101
1111 1111 1011
可以看到每一位中其中乙個都有1
答案 :1111 1111 1111
運算的兩個數,轉換成二進位制數後,進行異或(^)運算
如果相應位置上的數相同,該位取0,如果不同改位取1。
5 ^ -5
0000 0000 0101
1111 1111 1011
答案: 1111 1111 1110
同時任何數異或0都是其本身,乙個數如果異或自己則等於0
這樣我們可以用異或來交換兩個數的值
比如交換x,y的值
x ^= y; x = x ^ y
y ^= x; y = y ^ x ^ y
x ^= y; x = ( x ^ y ) ^ (y ^ x ^ y) ; --------- //最後一步 x ^= y 時 x = x ^ y; y = y ^ x ^ y
將乙個數二進位制下的數向左移若干位,
比如 x << y 就是將二進位制下的x 向左移 y 位
例 : 5 << 5
5 : 0000 0000 0101
5 << 5 : 0000 1010 0000
在10進製下就等於160
我們可以思考一下,在十進位制中,乙個數每乘一次10就向左進一位。
那麼在二進位制中,同10進製一樣,二進位制中每乘一次2就向左進一位,
那麼乙個數左移x 就等價於乙個數乘 2x。
將乙個數在二進位制下右移若干位
與左移用法相同
例 5 >> 2
5:0000 0000 0101
5 >> 2 : 0000 0000 0001
十進位制下等於1
這裡與左移類似,十進位制下每除10整數字就退一位
那麼右移就等價於除了幾次2
同時右移運算是向下取整的
其實在說補碼的時候,取反就已經說了,就是將取反的數在二進位制下的每一位取相反的數
5 : 0000 0000 0101
~5 : 1111 1111 1010
c語言位運算 C語言學習筆記(二)位運算
這一節主要說的是位運算,計算機中的執行速度 位運算 加減 乘除 求餘 位運算就是將數字轉換成二進位制後進行運算,之後再將數字轉換成原來的進製 與運算 當兩個數相與時,只有都為l的時候結果才為1,其餘情況結果都為0,符號 include int main 這個程式可以判斷a是偶數還是奇數,輸出為1說明...
C語言學習筆記 進製和位運算
第一部分 進製 一 基本概念 進製就是不同的計數方式,預設情況下寫的數字都是十進位制的。1 二進位制 逢2進製,0b或0b開頭 int number2 0b1100 2 十進位制 逢10進製 int number 12 3 八進位制 逢8進製,0開頭 int number3 014 4 十六進製制 ...
C語言學習筆記之位運算求餘
我們都知道,求乙個數被另乙個數整除的餘數,可以用求餘運算子 但是,如果不允許使用求餘運算子,又該怎麼辦呢?下面介紹一種方法,是通過位運算來求餘,但是注意 該方法只對除數是2的n次方冪時才有效。在移位運算中我們可知,計算機中的資料都是0和1的序列,當我們把某個數字左移一位,該數字會擴大為原來的2倍 而...