我试图找到这个问题,但其他所有问题都与我的问题无关。
我的问题:我有一个类似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的帮助。是否需要屏蔽?
答案 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);
}