- bitXor
首先分析题目:意思为x与y异或运算,只能使用~(非运算),&(与运算)
x,y异或表示为x⊕y
运算法则为x⊕y = (¬x ∧ y) ∨ (x ∧¬y)
¬:可以理解为~(非运算)
∧:可以理解为&(与运算)
∨:可以理解为 | (或运算)
这个题目只允许使用~,&,需要把 | 转化为~,&
(¬x ∧ y) ∨ (x ∧¬y)<==> ¬((¬(¬x ∧ y) )∨¬(x ∧¬y)))
然后用德·摩根定律
得到最后的结果¬ ((¬(¬x ∧ y) )∧¬ (¬(x ∧¬y)))
最后整理得到(((~x&y))& ((x&y)))
-
tmin
首先分析题目:意思为返回2进制的最小值
可以使用! ~ & ^ | + << >>
2进制最小值为-128,也就是1000 0000 0000 0000
要得到结果需要第一位为1,例如 0000 0000 0000 0001
将1左移31位就可以得到1000 0000 0000 0000
还有像1,3,5这样的都可以左移31位得到结果
int a=5;
return a<<31; -
isTmax
首先分析题目:如果x是2进制补码最大值则返回1,否则返回0
可以使用! ~ & ^ | +
! 表示逻辑非,是逻辑运算符,运算对象是真或假。
若表示a不等于0,就写成!a=0,假设a=1,则!a=0;假设a=0,则!a=1
根据题目可以得到x为2进制最大值也就是127,二进制补码为
0111 1111 1111 1111
想要得到结果需要将x转化为0,得到相反的结果,然后 ! 就可以
得到最后的结果
如果将最大值和最小值相加,然后再取反就可以得到0
定义a=x+1;则a为最小值,即1000 0000 0000 0000
然后x=x+a;得到0xFFFFFFFF,即1111 1111 1111 1111
再将x=~x;得到全零,即0000 0000 0000 0000
然后!就得到 0000 0000 0000 0001
但是0xFFFFFFFF也是一种特殊情况,它本身就是全一的情况,它加1也可以得到全零,需要将这种情况排除,
可以将a取反,一个非零的布尔值都是ture,也就是1;
然后再x=x+a,x要么加0,要么加1
得到最后结果
4.allOddBits
首先分析题目:意思判断奇数位上的数字都为1,则返回1,否则为0
可以使用! ~ & ^ | + << >>
题目已经提示我们0xAAAAAAAA返回1;
0xAAAAAAAA也就是1010 1010 1010 1010 1010 1010 1010 1010
让x与0xAAAAAAAA判断比较
需要先得到0xAAAAAAAA;
可以定义a=0xAA;
然后将a左移24位,左移16位,左移8位,再加上a本身就可以得到
AA 0000 0000 1010 1010
AA<<8 1010 1010 0000 0000
AA<<16 1010 1010 0000 0000 0000 0000
AA<<24 1010 1010 0000 0000 0000 0000 0000 0000
然后让赋值给a,即a=0xAAAAAAAA
如果x奇数位上都为1
则x为1010 1010 1010 1010 1010 1010 1010 1010
5.negate
首先分析题目:返回-x;
可以使用! ~ & ^ | + << >>
题目中的例题,1返回-1