我已经写了一段交换位位置(源位和目标位)的代码,它可以正常工作。但是有没有更优化的代码来完成这个任务呢?
int bit_swap(int num, int sbit, int dbit)
{
if(num & (1 << sbit) == num & (1 << dbit))
return num;
else
return (num ^ ((1 << sbit) | (1 << dbit)));
}
这里的num是输入数字,sbit是源位位置,dbit是目标位位置。
有没有一种方法可以在不使用if和else的情况下将此代码写成一行?
#define SWAP_BITS(x, i, j) (((x) >> (i)) & 1 != ((x) >> (j)) & 1) && ((x) ^= ((1U << (i)) | (1U << (j))))
该代码将x的第i位和第j位互换。 我们可以在调用时使用此函数来执行上述示例中的位交换:SWAP_BITS(x, 4, 1);
这将导致x和y值交换。注意,该代码仅适用于32位整数。对于其他数据类型和位数,需要相应地修改代码。 - leppiepos1
和pos2
或类似的名称,如某些答案中所示。此外,在处理单个位时,使用无符号整数通常是一个好主意,至少如果您希望您的代码可移植。但这取决于您需要它做什么,只要知道您可能会遇到负值问题即可。 - Secure& has lower precedence than ==; == will be evaluated first [-Wparentheses]
在if(num & (1 << sbit) == num & (1 << dbit))
中。 - Matthieu M.