交换字节中的每两位


在本文中,我们将讨论交换给定数字中每个交替位的代码解决方案,并返回结果数字。我们将使用位操作的概念,以便在恒定时间内解决问题,而无需使用任何循环。

问题陈述 - 我们得到一个数字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)。

更新于:2023年8月16日

315 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告