ビット演算を理解する

int main(int argc, const char * argv[])
{
    int origin, bitmask,or,and,xor, not, nor, nand;
    
    origin = 0b0101;
    bitmask = 0b0001;
    
    or = origin | bitmask;  //  0101 | 0001 = 0101 => 5
    and = origin & bitmask; //  0101 & 0001 = 0001 => 1
    xor = origin ^ bitmask; //  0101 ^ 0001 = 0100 => 4
    not = ~origin;          //  ~0101 = 1010 => 8 + 2 = 10 ではない
                            //1010は2の補数表現のとき最上位ビットが1の数は負となる
                            //2の補数表現の直し方=1を引いて、全ての項を反転する
                            //1010は1010-0001=1001を反転=0110=4+2=6だけど
                            //最上位ビットが1だから負なので-6

    //NORとNANDの演算子はない => ORの結果をNOTするかANDの結果をNOTする
    nor = ~or; // 0101 | 0001 = 0101 を反転 = 1010を2の補数表現とすると
                //1010-1=1001を反転して0110=4+2=6 負なので-6
    nand = ~and; // 0101  0001 = 0001 を反転 = 1110を2の補数表現とすると
                // 1110-1=1101を反転して0010 = 2 負なので-2
    printf("%d",or);
    printf("\n");
    printf("%d",and);
    printf("\n");
    printf("%d",xor);
    printf("\n");
    printf("%d",not);
    printf("\n");
    printf("%d",nor);
    printf("\n");
    printf("%d",nand);
    printf("\n");

    return 0;

}