C++ 交换字节中的每两位
在本文中,我们将讨论代码解决方案,以交换给定数字中每个交替位,并返回结果数字。我们将使用位操作的概念来在不使用任何循环的情况下以恒定时间解决问题。
问题陈述−我们给出一个数字n,我们必须交换相邻的一对位。
换句话说,我们必须交换每个奇数位和其相邻的偶数位。
限制条件:在解决问题时,我们必须记住不能使用循环,我们只能以O(1)的时间复杂度执行我们的代码。
示例
输入 −n = 10011110
输出 −交换偶数位置位和奇数位置位后,得到的二进制数为:01101101
输入 −n = 10011110
输出 −交换偶数位置位和奇数位置位后,得到的二进制数为:01101101
解释 −让我们考虑前面的示例,以便更好地理解。
n = 10011110
Even position bits in n are E – 1 x 0 x 1 x 1 x
Odd position bits in n are O – x 0 x 1 x 1 x 0
对于结果,我们希望将偶数位上的位放在奇数位上,反之亦然
对于奇数位上的偶数位,
我们需要将偶数位置向右移动一个位置。
因此,对于偶数位上的位,我们只需将 E >> 1 来得到所需的位置。
同样地,我们需要将奇数位上的位左移一个位置才能得到奇数位所需的位置。
因此,对于奇数位上的位,我们只需将 O << 1 来得到所需的位置。
现在下一个问题是提取奇数位和偶数位的位。
我们知道,
0x55 = 01010101 in which every only odd position bits are set ( non 0 ).
0xAA = 10101010 in position bits are set. which, only odd
因此,要从n中提取E,我们只需要执行。
E = n & 0xAA
同样地,要从n中提取O,我们需要执行以下操作-
O = n & 0x55
现在,要找到交换后的输出,
步骤
涉及的步骤是:
- E >> 1
-
O << 1
-
现在,我们使用或操作符组合E和O。
-
因此,我们的结果将是 – Result = ( E >> 1 | O << 1 )
示例
此方法的代码表示如下 –
#include<bits/stdc++.h>
using namespace std;
unsigned int swapbits(unsigned int n) {
unsigned int E = n & 0xAA ;
unsigned int O = n & 0x55 ;
unsigned int result = (E >> 1)|(O << 1);
return result;
}
int main() {
unsigned int n = 14;
cout << "After swapping the even position bits with off position bits, the binary number obtained is " << swapbits(n) << endl;
return 0;
// code is contributed by Vaishnavi tripathi
}
输出
After swapping the even position bits with off position bits, the binary number obtained is 13
时间复杂度-这种方法的时间复杂度为O(1)。
空间复杂度-我们没有使用任何额外的空间。辅助空间复杂度为O(1)。