在 C

中查找、设置、清除、切换和修改位

原文:https://www . geesforgeks . org/find-set-clear-toggle-and-modify-bit-in-c/

给定一个正整数 N ,任务是对 c 中 N 的二进制表示执行以下操作序列

  • 查找位:N 的二进制表示中查找 K T5】位。
  • 设置位:如果KthT5】位为 0 ,则设置为 1 。否则,保持不变。
  • 清零位:如果 K 位为 1 ,则清零至 0 。否则,保持不变。
  • 切换位:如果KthT5】位为 1 ,则将其更改为 0 ,反之亦然。
  • 修改位:用给定位替换 K T5】位。

示例:

输入: N = 5,K = 1,P = 0 输出: K(= 1) 位的 5 为 1。 设置第 K(= 1) 将 N 修改为 5 清除第 K(= 1) 将 N 修改为 4。 切换第 K(= 1)位将 N 修改为 4。 用 P(= 0)替换 K(= 1) 位会将 N 修改为 4

输入 : N = 10,K = 2,P = 1 输出: K (= 2)位 5 为 1。 设置第 K(= 2)位将 N 修改为 10。 清除第 K(= 2)位会将 N 修改为 8。 切换第 K(= 2)位将 N 修改为 8。 将第 K(= 2) 替换为 P(= 1)会将 N 修改为 10。

方法:按照以下步骤查找、设置、清除、切换和修改 N 二进制表示中的第 K 位。

找到一点:

 (N >> K) & 1

设置位:

 N = N | (1 << K)

清零位:

 N = N & ~(1 << K)

切换位:

 N = N ^ (1 << K)

修改一点:

 N = N | (P << K)

下面是上述方法的实现:

C

// C program to implement
// the above approach

#include <stdio.h>

// Function to set the kth bit of n
int setBit(int n, int k)
{
    return (n | (1 << (k - 1)));
}

// Function to clear the kth bit of n
int clearBit(int n, int k)
{
    return (n & (~(1 << (k - 1))));
}

// Function to toggle the kth bit of n
int toggleBit(int n, int k)
{
    return (n ^ (1 << (k - 1)));
}

// Function to modify k-th bit with p
int modifyBit(int n, int k, int p)
{
    return (n | (p << k));
}

// Function to find the kth bit of n
int findBit(int n, int k)
{
    return ((n >> k) & 1);
}

// Utility function to perform
// the specified Bit Operations
void bitOperations(int n, int k,
                   int p)
{

    printf("K(= %d)-th bit of %d is %d\n",
           k, n, findBit(n, k));

    printf("Setting K(= %d)th bit modifies N to %d\n",
           k, setBit(n, k));

    printf("Clearing K(= %d)th bit modifies N to %d\n",
           k, clearBit(n, k));

    printf("Toggling K(= %d)th bit modifies N to %d\n",
           k, toggleBit(n, k));

    printf("Replacing the K(= %d)<sup>th</sup> bit", k);
    printf(" with P(= %d) modifies N to 10\n",
           modifyBit(n, k, p));
}

// Driver Code
int main()
{
    int n = 5, k = 1, p = 1;
    bitOperations(n, k, p);

    return 0;
}

Output:

K(= 1)-th bit of 5 is 0
Setting K(= 1)th bit modifies N to 5
Clearing K(= 1)th bit modifies N to 4
Toggling K(= 1)th bit modifies N to 4
Replacing the K(= 1)th bit with P(= 7) modifies N to 10

时间复杂度: O(log(N)) 辅助空间: O(1)