bitXor_tmin_isTmax_位级实现

本文介绍了三个位运算相关的编程挑战:bitXor用于计算两个整数的异或结果;tmin用于找出补码形式下的最小二进制数;isTmax用于判断一个整数是否为最大补码数。每个挑战都限定了可用的操作符及操作次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值