交换字节中的每两位
在本文中,我们将讨论交换给定数字中每个交替位的代码解决方案,并返回结果数字。我们将使用位操作的概念,以便在恒定时间内解决问题,而无需使用任何循环。
问题陈述 - 我们得到一个数字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。
因此,我们的结果将是 – 结果 = (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)。
广告