1. 程式人生 > >位操作實現加減乘除四則運算

位操作實現加減乘除四則運算

tle 參與 nbsp pre 圖片 操作數 整數 spa 或操作

解決方案

需要熟練掌握一些常見的位操作實現,具體為:

1)常用的等式:-n=~(n-1)=~n+1

2)獲取整數n的二進制中最後一個1:n&(-n)或者n&~(n-1)如:n=010100,則-n=101100,n&(-n)=000100

3)去掉整數n的二進制中最後一個1:n&(n-1),如:n=010100,n-1=010011,n&(n-1)=010000

1 利用位運算實現加法

由於我們不能使用任何算術運算符,因此可供我們使用的就只有位運算符了。 於是我們把操作數看成二進制表示,然後對它們做類似的操作:

  1. 不考慮進位的按位求和,(0,0),(1,1)得0,(1,0),(0,1)得1, 使用異或操作可以滿足要求。
  2. 只考慮進位,只有(1,1)才會產生進位,使用按位與可以滿足要求。 當前位產生進位,要參與高一位的運算,因此按位與後要向左移動一位。
  3. 遞歸求和,直到進位為0

實現代碼:

技術分享圖片
int add(int a,int b)
{
    int carry,add;
    do{
        add=a^b;
        carry=(a&b)<<1;
        a=add;
        b=carry;
    }while(carry!=0);
    return add;
}
技術分享圖片

2 減法實現

減法和容易地轉換為加法:a-b=a+(-b)=a+(~b+1)

int subtract(int a,int b)
{
    return add(a,add(~b,1));
}

3 乘法實現

乘法的實現可以轉換成:k31*(2^31)+k30*(2^30)+...+k2*(2^2)+k1*(x^1)+k0*(x^0);其中k0~k31取0或者1

技術分享圖片
//正整數的乘法
int multiply(int a,int b)
{
    int ans=0;
    while(b)
    {
        if(b&1)
            ans=add(ans,a);
        a=a<<1;
        b=b>>1;
    }    
    return ans;
}
技術分享圖片

4 除法實現

技術分享圖片
int divide(int a,int b)
{
    int count=0;
    while(a>=b)
    {
        a=subtract(a,b);
        count=add(count,1);
    }
    return count;
}
技術分享圖片

改進的除法:

技術分享圖片
int div(const int x,const int y)
{
    int left_num=x;
    int result=0;
    while(left_num>=y)
    {
        int multi=1;
        while(y*multi<=(left_num>>1))
        {
            multi=multi<<1;
        }
        result+=multi;
        left_num-=y*multi;
    }
    return result;
}
技術分享圖片

位操作實現加減乘除四則運算