[c/c++] programming之路(31)、位運算(二)

1、取反的高級用法

#include<stdio.h>
#include<stdlib.h>

//取反的做用:末位清零        取反適用於各類位數不一樣的數據
void main0(){
    unsigned char ch=73;        //0100 1001
    unsigned short sh=16385;    //0100 0000 0000 0001    
    ch=ch&~1;//抹平最後一位
    sh=sh&~1;
    printf("%d,%d\n",ch,sh);    
    system("pause");
}

//求餘數,不用求餘運算符
void main(){
    unsigned char ch=73;    //0100 1001 求出73被4整除的餘數    
    //首先,將73換爲2進制數,而後抹平最後兩位(抹平後的數就能夠整除4了)
    printf("%d\n",ch-(ch&~3));// ch&~3    抹平最後兩位
    system("pause");
}

2、內存(高位在高字節,低位在低字節)

3、補碼

#include<stdio.h>
#include<stdlib.h>

void main(){
    //printf不會進行類型轉換
    printf("%d\n",10.3);//printf無論是什麼類型,按照%d,%f解析數據,不一樣的解析方式有不一樣的結果
    printf("%f\n",10);
    printf("%d\n",(int)10.3);
    printf("%f\n",(float)10);

    system("pause");
}

char ch=1,ch1='1';//字符與編號的區別
printf("%d,%d\n",ch,ch1);
system("pause");

#include<stdio.h>
#include<stdlib.h>

void main(){
    int x=4294967295;
    int y=-1;
    //1111 1111 1111 1111 1111 1111 1111 1111    在內存中的存儲方式
    //無符號,沒有符號位,全都是數據    4294967295

    //0000 0000 0000 0000 0000 0000 0000 0001    1原碼
    //1000 0000 0000 0000 0000 0000 0000 0001    -1原碼
    //1111 1111 1111 1111 1111 1111 1111 1110    -1反碼
    //1111 1111 1111 1111 1111 1111 1111 1111    -1補碼

    printf("%d,%u\n",x,x);
    printf("%d,%u\n",y,y);
    system("pause");
}

unsigned int num=-1;
//1111 1111 1111 1111 1111 1111 1111 1111    內存的存儲方式
printf("%d,%u\n",num,num);

4、移位(CPU寄存器中進行計算)

1.左移

#include<stdio.h>
#include<stdlib.h>

//左移一位等於*2
void main(){
    unsigned char ch=1;      //0000 0001        1
    printf("%d\n",ch<<1);    //0000 0010        2
    printf("%d\n",ch<<2);    //0000 0100        4    // ch<<2 CPU寄存器計算
    printf("%d\n",ch);       //移位不改變原值
    printf("%d\n",ch=(ch<<2));//經過賦值號改變原值
    system("pause");
}

//左移要注意溢出,考慮數據的極限
void main0(){
    unsigned char ch=1;        //0000 0001        1        
    //ch=ch<<7;                //1000 0000        128
    ch=ch<<8;                //10000 0000    溢出,爲0
    printf("%d\n",ch);        //溢出後的數據沒法讀取
    system("pause");
}

 2.右移

#include<stdio.h>
#include<stdlib.h>

//右移一位等於÷2
void main(){
    unsigned char ch=128;    //1000 0000                
    printf("%d\n",ch>>1);        
    printf("%d\n",ch>>2);        
    printf("%d\n",ch);
    printf("%d\n",ch=ch>>5);        
    system("pause");
}

5、微軟試題

#include<stdio.h>
#include<stdlib.h>

void main(){
    int x=9999;        //10 0111 0000 1111
    int i=0;
    while (x)
    {
        i++;
        x=x&(x-1);//每次操做清零一個「1」,用於統計二進制整數有多少個1
    }
    printf("%d\n",i);        
    system("pause");
} 

返回值爲8spa

補充:9999如何轉爲2進制數

    

相關文章
相關標籤/搜索