第一题:
/*
* bitXor - x^y using only ~ and &
* Example: bitXor(4, 5) = 1
* Legal ops: ~ &
* Max ops: 14
* Rating: 1
*/
题目的意思是只能使用~(非)和与(&)实现异或(^)
x & y = 1 (11)
x & y = 0(01,10,00)
对于x,y,只能有两种&组合,x&y和~x & ~y,如果是 ~x&y,或者是 ~y&x,都是行不通,要么都取反,要么都不取,多次尝试 ~(x & y)&~(~x&~y)可以实现异或
第二题:
/2
/*
* isTmax - returns 1 if x is the maximum, two's complement number,
* and 0 otherwise
* Legal ops: ! ~ & ^ | +
* Max ops: 10
* Rating: 1
*/意思是输出2进制的最小值
2进制最高位1为负数,0为正数。这里需要用到移位运算符,左移1位相当于乘以2
根据这张图很容易得到32位的2进制最小值为100.....00(共31个0)用移位运算符表示为1<<31
第三题:
* isTmax - returns 1 if x is the maximum, two's complement number,
* and 0 otherwise * Legal ops: ! ~ & ^ | +
* Max ops: 10
* Rating: 1
*/
int isTmax(int x) {
return 2;
这道题目要求实现一个函数isTMax,该函数作用是判断输入的整数是否为补码(计算机中用来表示负数的一种编码方式)最大值,如果是补码最大值返回1,如果x不是补码最大值,则返回0。
可以通过对x取相反数来判断这个整数是否为补码最大值(在补码表示中,一个数的相反数等于它按位取反再加一)如果是最大补码数01111111(假设是8位2进制的数),它按位取反再加一(只有最低位相同),再与它本身进行异或(相同为0,不同为1)所以结果应该为11111110再取反为00000001(即为1)表示x为最大补码数
用运算符表示为!(x^(~x+1))
第四题:
* allOddBits - return 1 if all odd-numbered bits in word set to 1
* where bits are numbered from 0 (least significant) to 31 (most significant)
* Examples allOddBits(0xFFFFFFFD) = 0, allOddBits(0xAAAAAAAA) = 1
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 12
* Rating: 2
*/
这是一个用于检查一个32位有符号整数的奇数位是否全为1的C语言函数,需要符合以下需求:输入一个32位整数如果x的奇数位均为1则返回1,否则返回0.可以使用 ! ~ & ^ | + << >>这些运算符,最多使用12个运算符。
首先想到32位有符号整数的奇数位全为1的数假设它是y=0xAAAAAAAA,让y与x先进行&运算(两个都为1结果才为1)如果x是奇数位全为1那么&运算后所有的奇数位仍然全部为1,(偶数位不管是0还是1&运算之后全都为0),再进行^运算(相当于与y本身进行异或)结果为0,因为题目要返回1所以最后的结果是~((x&y)^y)
第五题:
negate - return -x
* Example: negate(1) = -1.
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 5
* Rating: 2
*/
int negate(int x) {
return 2;
}
该函数的作用是计算一个32位有符号数的相反数
2进制的相反数取反加一
所以是~x+1
第六题
* isAsciiDigit - return 1 if 0x30 <= x <= 0x39 (ASCII codes for characters '0' to '9')
* Example: isAsciiDigit(0x35) = 1.
* isAsciiDigit(0x3a) = 0.
* isAsciiDigit(0x05) = 0.
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 15
* Rating: 3
*/
这道题的意思是如果x在大于等于0x30且小于等于0x39就返回1,否则返回0,这里需要判断。
这个题x需满足:0x30=<x=<0x39,我们将它拆分为,0x30=<x并且x=<0x39
x-0x30>=0------>(x+~0x30)=a
0x39-x>=0------>(0x39+~x)=b
然后只需要判断符号位,当a,b均大于等于0时,a和b的符号位一定为0。所以我们分别将a,b右移31位,当a,b均为0时,判断为真。
结果为!((x + ~0x30)>>31) | ((0x39 + ~x)>>31))
第七题
* conditional - same as x ? y : z
* Example: conditional(2,4,5) = 4
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 16
* Rating: 3
*/
最后要进行一个或运算,x要返回一个值,当x为真时可以得到y的值此时z值要等于0;当x为假时,y会变为0,而得到z的值。最后变为0的操作我们需要用到&,和0x0000 0000进行与运算,则任何数都会返回为0。就是说到最后时x变为0xFFFF FFFFF,0x0000 0000分别和y,z进行&运算。看题目给的例子,当x为2时,返回4(y)。所以当x为非0数时返回y,则当x为0时返回z
结果是(x & y) | (~x & z)