鍍金池/ 問答/C  HTML/ 位運算符一般有哪些妙用?

位運算符一般有哪些妙用?

位運算符一般有哪些妙用呢?比如解決某個問題,用位運算符就很簡單。

回答
編輯回答
執(zhí)念

一個非空數(shù)組,只有一個元素出現(xiàn)奇數(shù)次,其余出現(xiàn)偶數(shù)次,找出那個元素:

    int singleNumber(vector<int>& nums) {
      return std::accumulate(nums.begin(), nums.end(), 0, [](int res, int n) { 
          res ^= n;
          return res;
        });
    }

一個非空數(shù)組,只有一個元素出現(xiàn)1次,其余出現(xiàn)3次,找出那個元素:

    int singleNumber(vector<int>& nums) {
      int twos = 0;
      return std::accumulate(nums.begin(), nums.end(), 0, [&twos] (int ones, int n) { 
          ones ^= n & ~twos; 
          twos ^= n & ~ones; 
          return ones;
        });
    }

一個非空數(shù)組,只有兩個元素出現(xiàn)1次,其余出現(xiàn)2次,找出那兩個元素:

     vector<int> singleNumber(vector<int>& nums) {
               
        int xr=nums[0];
        for(int i=1;i<nums.size();i++)
            xr=xr^nums[i];
        
        int pos=xr&~(xr-1);

        int x=0,y=0;
        for(int i=0;i<nums.size();i++)
            if((pos)&nums[i])
                x=x^nums[i];
            else
                y=y^nums[i];
        
        vector <int> res;
        res.push_back(x);
        res.push_back(y);
        return res;
    }

卡馬克算法:

//
// 計算參數(shù)x的平方根的倒數(shù)
//
float InvSqrt (float x)
{
    float xhalf = 0.5f*x;
    int i = *(int*)&x;
    i = 0x5f3759df - (i >> 1); // 計算第一個近似根
    x = *(float*)&i;
    x = x*(1.5f - xhalf*x*x); // 牛頓迭代法
    return x;
}
2017年8月3日 01:00
編輯回答
青檸

比如色值轉(zhuǎn)換,16進制轉(zhuǎn)rgb


function hexToRgb(hex){
    var hex = hex.replace("#","0x"),
        r = hex >> 16,
        g = hex >> 8 & 0xff,
        b = hex & 0xff;
    return "rgb("+r+","+g+","+b+")";
}
2018年5月20日 11:03
編輯回答
負我心

比如記錄活動狀態(tài),成長值。。用位運算給一個變量多種狀態(tài)
可以看這個例子;用位運算給一個變量多種狀態(tài)

2018年6月21日 13:57
編輯回答
九年囚
    異或運算:不使用第三個變量交換兩個變量的值
    $exchange = function (){
        $a = 19;
        $b = 20;

        $b = $a ^ $b;
        $a = $b ^ $a;
        $b = $a ^ $b;

        echo $a.'-'.$b.PHP_EOL;
    };
    $exchange();
2018年1月20日 07:09