c - 了解 C 编程中的位操作(设置/清除)

标签 c bit-manipulation bit

我一直无法理解 C 中整数的位运算。

假设我有数字 13。它的二进制表示是 1101。如何将钻头设置在第二个位置?如何清除该位?

这是我迄今为止编写的用于设置位的函数:

int setBit(int data, int pos, int val)
{       
    if (val==1)
        data |= (1U << (pos - 1));
    else
        data ^= (1U << (pos-1));

    return data;
}

这能正常工作吗?

最佳答案

n = n & (~(1U <<x))将重置位置 x 中的位。 实际上我们正在做的假设 n=1101 我们想要重置第三位。

它是如何工作的?

所以 1U <<3=000....1000

~(1U <<3)=111....0111

n=000..1101

& 111..0111

结果是 000..0101。

用于在位置x处插入一个位y:(位置从0开始)

1101---->11y01 给出位置 2 的示例。

num= FFFF FFFF (in hex)(all 1's) //1111......1111
number=N  // in which you will insert bit
num1=num<<x;      //for x=2 as in this case
                  //num1=1111.....1100
num2=~(num1);     //num2=0000.....0011
lowbits=N & num2; //    =0000.....0001 (N=1101)
highbits= N &num1;//    =0000.....1100
highbits<<=1;     //    =0000....11000 
N= highbits | lowbits;//=0000....11001

现在使用下面描述的方法根据需要设置第 x 位(此处 x=2)

<小时/>

注意:更一般地,可以通过这种方式将数字 n 的第 k 位更改为 y(可能是 0 或 1)

n^=(-y ^ n) & (1U <<k); (&- logical and)

删除一位与插入类似。一步步执行操作就可以了。

编辑:我已将 1 的使用更改为 1U,因为在第一种情况下,仅使用 1 而不使用任何修饰符时被定义为有符号 int。从 K&R 来看,有符号值的右移是实现定义的。此外,如果左移一个有符号数,从而影响符号位,则结果是未定义的。

These operations on unsigned value have well define behaviour: Vacated fields are filled with zeroes.

关于c - 了解 C 编程中的位操作(设置/清除),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29185661/

相关文章:

c# - Java 中的移位比乘法和除法更快吗? 。网?

java - 从另一个号码获取不太具体的号码

C - 如何从位字段接收位作为函数中的参数?

C unsigned int 数组和位移

c - 我如何阅读这个复杂的 C 声明?

c - 未调用信号函数

Ruby bit banging,如何执行加法和负法

c - C中的左移位操作

c - 2D 到 3D 平行投影

c - 线程进给其他多线程