highlight: a11y-dark
有两个数a,b,第一个数只为0或1,另一个数为一个任意整数,只使用位运算实现下要求。
当第一个数为0时,另一个数为偶数时结果为1,另一个数为奇数时结果为0;
当第一个数为1时,另一个数为偶数时结果为0,另一个数为奇数时结果为1。
我们知道当一个数为0时,我们可以通过以下两种运算确定追后结果
一个数^1运算使最终的结果为1,
一个数 ^0运算使最终的结果为0
,然后我们知道偶数的二进制表现形式的最后一位一定为0,然后题目要求的是另一个数为偶数时结果为1,奇数时结果为0,为了满足题目要求我们可以对另一个数进行位取反运算,使偶数的二进制表现形式的最后一位变成为1,然后在对进行&1运算,把该数的二进制形式的最后一位保留,其余的位为清零。思路转化为代码就是
a^(~b&1)
最整体得到的结果满足了第一个要求。然后我们仔细分析第二个要求,发现使是第一个要求的^情况。即
a^(~b&1)
也包含了第二个要求。
C#代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 位运算
{
class Program
{
static void Main(string[] args)
{
int a = Convert.ToInt32(Console.ReadLine());
int b= Convert.ToInt32(Console.ReadLine());
Console.WriteLine((a ^ (~b & 1)));
}
}
}
然后我们可以把0换成偶数,1换成奇数,通过上面的思路可以得到两数奇偶情况的真假表达式。
比如:
上面的要:前偶后奇为假,前奇后偶为真:a&1^(~b&1)
我们可以要求两数一奇一偶时为真,否则为假:(a&1)|(b&1)等。
然后我们知道位运算的速度是很快的,所以我们在做一些算法题的时候可以使用上面的规律来增加我们的运算速度,当然最重要的是赚一波逼。