原碼:正數的二進位制數表示就是原碼。
負數的原碼按照絕對值大小轉換成的二進位制數,然後最高位補1。
反碼:正數的反碼和原碼相同。
負數的反碼和除符號位按位取反。
補碼:正數的補碼和原碼相同。
負數的補碼為反碼加1。
計算機中,採用補碼表示和儲存。
為什麼採用補碼:
由於計算中的cpu只有加法器,沒有減法器,所以在計算機採用原碼做減法是會存在這樣的問題:對於1-1=0。
看做1+(-1)=0 二進位制表示 0001+1001=1001 變成了十進位制的負1而不是0。採用補碼運算,則補碼加法成為:[x+y]補 = [x]補 + [y]補,補碼的減法變為:[x-y]補 = [x]補 - [y]補 = [x]補 + [-y]補 。(0001)補+(1001)補 = 0001 + 1111 = 0000 (最高位的進製省略),這樣就順利得到了0。
無符號數:
無符號數即為每一位都用於存放數值,暫存器的位數為機器字長,機器字長16位,無符號數範圍為0-65535。
有符號數:
最高位用於表示符號,其他位用於表示數值,機器字長16位,有符號數範圍為-32768~+32767。(我們人為規定1000 0000 0000 0000為-32768)
左移:m右移:m>>n,把m右移n位,右面n位被丟棄,正數左面補0,負數左面補1
除法比位運算效率低很多
2、求二進位制中1的個數
int
digit
(int num)
return count;
}
2、一條語句判斷乙個整數是不是2的整數次方
return
(!(num
&(num
-1)==0));
3、輸入n和m,計算把m的二進位制改變多少個位可以得到n
int
digit
(int m,int n)
return count;
}
4、十進位制轉成七進製
class
solution
while(num>0)
reverse(str.begin(), str.end());//將字串翻轉
return str;
}string
converttobase7
(int num)
//正數和負數分開處理
else
//負數就在返回之前加乙個負數
return str; }//返回str
};
5、判斷二進位制0和1是不是交替出現的
class
solution
flag=n%2;
n/=2;
}return
true;//迴圈結束就是交替出現的}};
6、將區間內的所有數字按位與
class
solution
for(res=n;res>m;)
} return res;}};
7、十進位制轉十六進製制
string tohex(int num)
string hex = "0123456789abcdef";
string ans = "";
while(num && ans.size() < 8)
return ans;
}
位運算和進製轉換
位運算指的是對二進位制進行的計算處理。主要有 與 或 異或 求反 其特徵為 都是1的時候才是1 如 13 7 計算過程為 13的二進位制 1101 7的二進位制 0111 得到結果 0101 轉換成10進製則是5 計算過程為 1101 0111 按照或運算得到結果是 1111 轉化成10進製為 15...
筆記 Java 進製和位運算
二進位制 只有0和1組成的一組數成為二進位制數,計算機中的資料都是以二進位制形式進行儲存的。通常乙個二進位制數最高位是1,那麼對應的十進位制數為負數,如果最高位是0,那麼對應的數是正數 八進位制 乙個二進位制數表示成八進位制數,將該二進位制數從右到左每三位一組,每一組算出對應的十進位制數,每組對應的...
c語言 進製和位運算
一.進製 十進位制轉n進製 連除倒取餘.以 10 為例,不同進製的表示方法 十進位制 10 二進位制 0b1010 八進位制 010 十六進製制 0x10 int a 100 printf o a 如何輸出進製數 d 十進位制 o 八進位制 0x 十六進製制 位運算子 按位與 按位或 按位非 按位異...