我一直无法理解 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/