位操作基本運算符


       位操作的基本運算符有:與,或,取反,異或,左移,右移。

        要會使用位操作運算符,就不得不先對計算機存儲數字的方式有一定的了解。
        原碼:原碼是二進制的一種編碼方式,其中最前面的一位叫做符號位——0代表正數,1代表負數,其余為表示值。用一個8位的二進制數舉例。
       
        原碼很好理解,我們可以很容易知道它表示的二進制數,但是它不方便計算機的運算,所以補碼就誕生了。
        補碼:補碼是一個數存儲在計算機中的真正形式而原碼則是現實數字和計算機中數字的一個過渡,橋梁。

             下面是補碼與原碼的轉換關系:
                 正數:正數的補碼就是原碼

                 負數:負數的補碼是它的絕對值的原碼對每一位進行取反操作(0變1,1變0)所得到的數再加1。如,-1的絕對值為1,1的原碼為00000001,對000000001取反后得到11111110,最后加上1得到11111111,11111111這個數就是-1的補碼。
                 補碼將減法運算可以等同於加法運算,比如:
          
                 特殊情況:
          
                 得到的補碼不能再轉化成原碼(結果不對),但是我們的把這個特殊的補碼當作-128來看待。
             位操作符的應用(位操作的每一個數都是補碼形式):
             1. 判斷奇偶數

oid judge(int num) {
    if (num & 1) //奇數運算的結果為1,偶數則為0
        cout << "奇數" endl;
    else         
        cout << "偶數" << endl;
}

             2. 交換兩個數

void Swap(int &a, int &b)
{
    if (a != b)
    {
        a ^= b;
        b ^= a;
        a ^= b;
    }
}

           原理解釋:假設a 中 存儲的數字為A,b 為 B。
                             a ^ = b 等價於 a = a ^ b, 即 a = A ^ B;
                             b ^ = a 等價於 b = B ^ (A ^ B) ,因為異或運算符滿足交換律,所以B ^ (A ^ B) = (B ^ B) ^ A,容易知道,對兩個相同的數進行異或操作對於0(...0000000),而0和任意一個數進行異或操作對於這個數本身,所以b = A;
                            同理:a ^ = b 等價於 a = B;
           所以,a和b兩個變量中存儲的值發生的交換。
           3.變換符號

int change_sign(int a) {
    return ~a + 1;
}

           原理解釋:由補碼的知識我們知道,負數補碼由由其對應的正數的補碼(正數補碼 = 原碼)取反后得到,即~a + 1,如果要從正數得到負數則為~(a - 1)。~a + 1 與 ~(a - 1) 的結果一致,所以無論是一個數的符號變化都可以通過~a + 1實現。

          4.判斷正負數

void judge(int num) {
    if (num >> 31) 
        cout << "負數";
    else
        cout << "正數";
}

      

參考文章:文章1      文章2




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM