進数、ビット演算ノート

6931 ワード

  • 進数
  • ビット演算
  • 進数紹介
    数値の表示形式.
    一般的な進数は、バイナリ、10進数、8進数、16進数です.
    バイナリ:
    0と1,C言語では0 bの先頭または0 Bの先頭を表す.
    8進法:
    0,1,2,3,4,5,6,7 C言語で0で始まる数字、例えば045
    10進数:
    しぜんすう
    16進数:
    0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F C言語で0 xまたは0 Xで始まる数字
    進数間の変換:
    その他の進数は10進数の3要素に変換されます.
      1. デジタル:デジタルが1つの数の中にある位置.1つのシーケンスで、右から左へ0、1、2、3...
      2. 基数:数進基数は数
      3. ビット権:ビット権=デジタル値*基数^数ビット
    皆さんの重みの和は、この数を10進数に変換した表示形式です.
    10進数変換:
    2を除いて余剰をとり,余剰のシーケンスを逆さにすることがその数のバイナリ表現である.
    バイナリ10進法:
    すべてのビットの加算
    バイナリ16進法:
    整数部分で、4ビットのバイナリが左から右に結合します.小数部は右から左に結合する.
    16進数:
    一分解四;
    バイナリ8進法:
    三合一
    8進数変換:
    一分解三;
     
    マシン数:
    コンピュータにおける1つの数のバイナリ表現形式を、この数の機械数と呼ぶ.機械数は記号付きで、コンピュータに1つの数の最高位で記号を保存し、正数は0、負数は1である.
    真の値:
    符号ビット付きマシン数に対応する真の数値をマシン数の真値と呼ぶ. 
    1番目がシンボルビットであるため,マシン数の形式値は真の数値に等しくない.例えば、上には符号数10000011があり、その最上位1は負を表し、その真の数値は-3であり、形式値131ではない(10000011は10進数131に変換される).したがって,区別のために,符号ビット付きのマシン数に対応する真の数値をマシン数の真値と呼ぶ.
     
    原符号、逆符号、補符号:
    データのコンピュータでの記憶方法:データはコンピュータ内部で符号を補う形式で格納される.
    データは、符号のある数とない数に分けられます.
    符号なし数はすべて正数であり、10進法から直接バイナリに変換して直接記憶すればよい(実はこの10進法の補符号でもある).符号数がコンピュータ内部に用いられるのは、符号を補う形で格納される.(正数の最高位は符号ビット0、負数の最高位は符号ビット1である.
    正数:逆符号==補符号==原符号について.負数:逆符号==符号ビット以外の方は逆をとります.補数=逆符号+1)
     
    バイナリの符号化
    正数:原数、逆符号、補符号ともに同じ
    負数:逆符号=ソース符号の逆、補符号=逆符号+1、または補符号=ソース符号の逆+1、前提はすべて記号ビットが変わらない
    正数の先頭アドレスは0で、その元のコードは10進数から変換された2進数です.
    負数の先頭アドレスは1であり,その元のコードの後ろのビットも10進数に変換された過去のバイナリ数であり,いずれも符号数が符号化されている.
    1)原コード
    原符号は、符号ビットに真の値を加える絶対値である、すなわち、第1ビットで符号を表し、残りのビットで値を表す.
    2)逆符号化
    逆符号の表現方法は、正数の逆符号がそれ自体である.負数の逆符号はその元の符号に基づいて、符号ビットは変わらず、残りの各ビットは逆をとる.
    3)補数
    符号化の表現方法は、正数の符号化がそれ自体である.負数の補符号はその元の符号に基づいて、符号ビットは変わらず、残りの各位は逆を取って、最後に+1.(すなわち、逆符号化に加えて+1)
     
    ビット演算
    ビット演算とは、バイナリによる演算です.システムソフトウェアでは、バイナリビットの問題を処理する必要があることが多い.C言語には6個のビット操作演算子が用意されている.これらの演算子は、整数オペランド、すなわち、記号付きまたは記号なしのchar、short、int、longタイプにのみ使用できます.
    1)&按位与口诀:同1为1,有0为0
    対応する2つのバイナリがいずれも1の場合のみ、結果ビットは1であり、そうでなければ0である
    2)|按位或口诀:有1则一
    対応する2つのバイナリが1つであれば、結果ビットは1であり、そうでなければ0である
    3)^按位异或口诀:同0非1
    対応するバイナリビットが異なる(異なる)場合、結果は1、そうでない場合は0
    4)~取反
    各バイナリビットを反転(0変1,1変0)する
    以上はすべてバイナリで演算します
    1)<左シフト
    1、各二進位は全部左にn位移動し、高位は捨て、低位は0を補う
    1)左に移動すると数の正負性が変わる可能性がある
    2)左シフト1ビットは*2^nに相当
    例:1つの数に2を乗じたn次方程式をすばやく計算する
    (8<<3は8*2^3に等しい)
     
    2)>>右に移動
    各バイナリはすべてnビット右にシフトし、シンボルビットを一定に保つ
    x>>n,xのすべてのバイナリビットは右にnビット移動し,移動したビットは削除し,移動したビットはシンボルビットを補う.
    1、右に移動しても数の符号は変わりません
    2右シフトnビットは/2^nに相当
    用途:1つの数を2で割ったn次方程式をすばやく計算する(8>>3は8/2^3に等しい)
     
    テクニック:
    1)任意の数と1を&操作し,この数の最低ビットを得る
    2)ある位置を0にしたいなら、ある位置を0にして&演算する
     
    練習問題:
     1 /*
     2          ,                 。  n  0     ,  n  0     
     3  
     4    :    :               
     5   : 1101 0101 1100         0101 1100 1101
     6  
     7  8  */
     9 #include 
    10 
    11 unsigned bitTransfer(unsigned, int);//    
    12 
    13 int main(int argc, const char * argv[]){
    14     unsigned a = 9;
    15     int n = 10;
    16     
    17     unsigned b = bitTransfer(a, n);
    18     
    19     printf("    9  10     :%u
    ", b); 20 21 } 22 /** 23 * @author , 15-06-25 21:06:59 24 * 25 * @param number 26 * @param n 27 * 28 * @return 29 */ 30 unsigned bitTransfer(unsigned number, int n){ 31 if (n > 0) 32 return (number << n) ^ (number >> (32 - n)); 33 else{ 34 n = - n; 35 return (number >> n) ^ (number << (32 - n)); 36 } 37 }