bitXor
原题
/*
* bitXor - x^y using only ~ and &
* Example: bitXor(4, 5) = 1
* Legal ops: ~ &
* Max ops: 14
* Rating: 1
*/
int bitXor(int x, int y) {
return 2;
}
解释
请实现如下功能
输入 x, y (int)
输出x异或y的结果
请仅仅使用 以下符号:
- ~ 按位取反
- & 与
可使用的符号数最多为14个
限制
请不要使用循环, 函数, 判断,
所使用的符号数不算上()
可使用的整数最大为 0xFF (255)
实现
int bitXor(int x, int y) {
return ~(~(x & ~y) & ~(~x & y));
}
实现思路
由异或本身的定义得 x^y = ~xy+ ~yx
但是这题不让用 或
于是考虑进行逻辑表达式的转化。
整体取反两次,里层的 反 深入, 去掉 或。
于是就得到了上述的表达。
tmin
原题
/*
* tmin - return minimum two's complement integer
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 4
* Rating: 1
*/
int tmin(void) {
return 2;
}
解释
请实现如下功能
输出补码形式下 最小的2进制数。
请仅仅使用 以下符号:
- ! 非
- ~ 按位取反
- & 与
- ^ 异或
- | 或
- +算术加
- << 左移
-
算术右移
可使用的符号数最多为4个
限制
请不要使用循环, 函数, 判断,
所使用的符号数不算上()
可使用的整数最大为 0xFF (255)
实现
int tmin(void) {
return 1 << 31;
}
实现思路
其实就是要输出INT_MIN.
INT_MIN = 0x80000000;
总共32位。
将 0x1 左移 31 位即可实现。
以4位为例。
INT_MIN = 1000
0x1 = 0001
0x1 << 3 = 1000 = INT_MIN
isTmax
原题
/*
* isTmax - return 1 if x is the maximun, two's complement number,
* and 0 otherwise
* Legal ops: ! ~ & ^ | +
* Max ops: 10
* Rating: 1
*/
int isTmax(int x) {
return 2;
}
解释
请实现如下功能
输入 x (int)
如果x 是INT_MAX, 返回1
否则 返回0
请仅仅使用 以下符号:
- ! 非
- ~ 按位取反
- & 与
- ^ 异或
- | 或
- +算术加
可使用的符号数最多为10个
限制
请不要使用循环, 函数, 判断,
所使用的符号数不算上()
可使用的整数最大为 0xFF (255)
实现
int isTmax(int x) {
int i = x + 1;
int y = ~(x ^ i);
return !(y + !i);
}
实现思路
要去判断一个数是不是某个特定的数,就应该去找这个特定的数它独特的性质。
对于INT_MAX来说,(以下以4位为例)
其首位为0,其余为1, INT_MAX = 0111;
而当其再增加1时,将会得到1000,即INT_MIN.
0111 + 1 = 1000。
而1000又刚好为0111的反。这也就意味着, 1000 ^ 0111 = 1111
对于 0不在首位的数字, 如1011 , 1011 + 1 = 1100. 其不为 1011的反
因此 异或后得到的结果不为1111。
但是注意到 -1(1111)加1 后得到 0(0000),异或后得到 1111
这样就会出现误判。
于是我们利用0000 和 1000的不同 让直接的结果加上 它。
再去进行逻辑操作。
输入1111. 得到 y = 0000 , i = 0000,y + !i = 0001. 返回0
输入0111, 得到 y = 0000, i = 1000, y + !i = 0000 返回 1