本文概述
给定整数n和其中的两个比特位置p1和p2, 在给定位置交换比特。给定位置来自最低有效位(lsb)。例如, lsb的位置为0。
例子:
Input: n = 28, p1 = 0, p2 = 3
Output: 21
28 in binary is 11100. If we swap 0'th and 3rd digits, we get 10101 which is 21 in decimal.
Input: n = 20, p1 = 2, p2 = 3
Output: 24
我们强烈建议你最小化浏览器, 然后自己尝试。
方法1:
这个想法是首先找到这些位, 然后使用
基于异或的交换概念
, 即要交换两个数字" x"和" y", 我们执行x = x ^ y, y = y ^ x和x = x ^ y。
下面是上述想法的实现
C ++
// C program to swap bits in an integer
#include<stdio.h>
// This function swaps bit at positions p1 and p2 in an integer n
int swapBits(unsigned int n, unsigned int p1, unsigned int p2)
{
/* Move p1'th to rightmost side */
unsigned int bit1 = (n >> p1) & 1;
/* Move p2'th to rightmost side */
unsigned int bit2 = (n >> p2) & 1;
/* XOR the two bits */
unsigned int x = (bit1 ^ bit2);
/* Put the xor bit back to their original positions */
x = (x << p1) | (x << p2);
/* XOR 'x' with the original number so that the
two sets are swapped */
unsigned int result = n ^ x;
}
/* Driver program to test above function*/
int main()
{
int res = swapBits(28, 0, 3);
printf ( "Result = %d " , res);
return 0;
}
Java
// Java program to swap bits in an integer
import java.io.*;
class GFG
{
// This function swaps bit at
// positions p1 and p2 in an integer n
static int swapBits( int n, int p1, int p2)
{
/* Move p1'th to rightmost side */
int bit1 = (n >> p1) & 1 ;
/* Move p2'th to rightmost side */
int bit2 = (n >> p2) & 1 ;
/* XOR the two bits */
int x = (bit1 ^ bit2);
/* Put the xor bit back to
their original positions */
x = (x << p1) | (x << p2);
/* XOR 'x' with the original
number so that the
two sets are swapped */
int result = n ^ x;
return result;
}
/* Driver code*/
public static void main (String[] args)
{
int res = swapBits( 28 , 0 , 3 );
System.out.println ( "Result = " + res);
}
}
// This code is contributed by ajit..
Python3
# Python3 program to swap bits in an integer
# This function swaps bit at positions
# p1 and p2 in an integer n
def swapBits(n, p1, p2):
''' Move p1'th to rightmost side '''
bit1 = (n >> p1) & 1
''' Move p2'th to rightmost side '''
bit2 = (n >> p2) & 1
''' XOR the two bits '''
x = (bit1 ^ bit2)
''' Put the xor bit back to their
original positions '''
x = (x << p1) | (x << p2)
''' XOR 'x' with the original number
so that thetwo sets are swapped '''
result = n ^ x
return result
# Driver Code
res = swapBits( 28 , 0 , 3 )
print ( "Result =" , res)
# This code is contributed by SHUBHAMSINGH10
C#
// C# program to swap bits in an integer
using System;
class GFG
{
// This function swaps bit at positions
// p1 and p2 in an integer n
static int swapBits( int n, int p1, int p2)
{
/* Move p1'th to rightmost side */
int bit1 = (n >> p1) & 1;
/* Move p2'th to rightmost side */
int bit2 = (n >> p2) & 1;
/* XOR the two bits */
int x = (bit1 ^ bit2);
/* Put the xor bit back to
their original positions */
x = (x << p1) | (x << p2);
/* XOR 'x' with the original
number so that the
two sets are swapped */
int result = n ^ x;
return result;
}
/* Driver code*/
static public void Main ()
{
int res = swapBits(28, 0, 3);
Console.WriteLine( "Result = " + res);
}
}
// This code is contributed by akt_mit
输出如下:
Result = 21
方法2:
仅使用左移和XOR运算符可以解决此问题。这个想法是通过将所需的次数左移1次并使用XOR运算符来设置/取消设置第(p1)位和第(p2)位
(num = num ^(1 << bit_position))
.
下面是上述代码的实现。
C ++
//C++ code for swapping given bits of a number
#include<iostream>
using namespace std;
int swapBits( int n, int p1, int p2)
{
//left-shift 1 p1 and p2 times
//and using XOR
n ^= 1 << p1;
n ^= 1 << p2;
return n;
}
//Driver Code
int main()
{
cout << "Result = " << swapBits(28, 0, 3);
return 0;
}
//This code is contributed by yashbeersingh42
C
//C code for swapping given bits of a number
#include<stdio.h>
int swapBits( int n, int p1, int p2)
{
//left-shift 1 p1 and p2 times
//and using XOR
n ^= 1 << p1;
n ^= 1 << p2;
return n;
}
//Driver Code
int main()
{
printf ( "Result = %d" , swapBits(28, 0, 3));
return 0;
}
//This code is contributed by yashbeersingh42
Output:
Result = 21
如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请发表评论。