位运算符一般有哪些妙用呢?比如解决某个问题,用位运算符就很简单。
一个非空数组,只有一个元素出现奇数次,其余出现偶数次,找出那个元素:
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();
比如色值转换,16进制转rgb