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

位运算符一般有哪些妙用呢?比如解决某个问题,用位运算符就很简单。

阅读 4.5k
4 个回答

比如色值转换,16进制转rgb


function hexToRgb(hex){
    var hex = hex.replace("#","0x"),
        r = hex >> 16,
        g = hex >> 8 & 0xff,
        b = hex & 0xff;
    return "rgb("+r+","+g+","+b+")";
}

一个非空数组,只有一个元素出现奇数次,其余出现偶数次,找出那个元素:

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

一个非空数组,只有一个元素出现1次,其余出现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;
        });
    }

一个非空数组,只有两个元素出现1次,其余出现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;
    }

卡马克算法:

//
// 计算参数x的平方根的倒数
//
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;
}
    异或运算:不使用第三个变量交换两个变量的值
    $exchange = function (){
        $a = 19;
        $b = 20;

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

        echo $a.'-'.$b.PHP_EOL;
    };
    $exchange();