C:如何将特定位置的位更改为特定值?

时间:2018-11-26 10:01:35

标签: c position bit

我试图找到这个问题,但其他所有问题都与我的问题无关。

我的问题:我有一个类似0xFreeFoodU的东西,我必须在其中获取特定位置并将其翻转或使其变为1或0。

例如,位置2、6、10、14、18、22、26和30中的位应保持不变,而位置3、7、11、15、19、23、27和27中的位应保持不变。应该将31更改为1。我不想发布我的整个提示BC我不想作弊并让别人替我做硬件。但是给我一个答案至少可以帮助数百万人。

这是位操作。但是我不知道如何在特定位置操纵特定位。 :(

编辑,我无法上传完整的程序;它太长了。但是我有一个主要功能,在这里我可以调用所需的功能。理想情况下,该函数应具有return等功能;到目前为止,我已经

返回val_num ^ 0x22222222U; 但我应该补充一点。我只需要有关如何将某些位设置为1和0的帮助。是否需要屏蔽?

2 个答案:

答案 0 :(得分:1)

如果设法对XOR部分进行处理,则将部分设置位设置为1几乎是相同的:

使用所有位创建掩码:

unsigned int mask_0       = 0x....;      // bits that shall be set to 0

unsigned int mask_1       = 0x88888888;  // bits that shall be set to 1
// Note: this is 1<<3 | 1<<7 | 1<<11 ... All bits set that shall be changed

unsigned int mask_toggle  = 0x22222222;  // bits that shall be toggled
unsigned int value = 0xdeadbeef;

执行所需的操作:

// toggle bits
value = value ^ mask_toggle;

// set bits to 1
value = value | mask_1;

// set bits to 0
value = value & ~mask_0;

答案 1 :(得分:0)

使用按位或运算符(|)进行设置。

number |= (1 << bitposition);

使用按位AND运算符(&)清除一位。

number &= ~(1 << bitposition);

XOR运算符(^)可用于切换一位。

number ^= (1 << bitposition);

这是程序

#include<stdio.h>
void main()
{
        int a[] = { 3, 7, 11, 15, 19, 23, 27, 31},b = 1200,i;
        for(i=0;i<8;i++)
                b ^= (1 << a[i]);
        printf("%d\n",b);
}