给定一个数字(int a = 0XABCDE98)
我试图将D
位设置为6
。
即在比特操作之后,数字应为(0XABC6E98)
。
我已经编写了一个小C程序来进行位操作,但不知怎的,我无法看到正确的位更改。 请帮助我找到程序中可能缺少的内容。
#include<stdio.h>
int main()
{
int n = 0xABCDE98;
n |= (n & 0X0000) | 0x6000;
printf("%x\n", n);
return 0;
}
o/p - abcfe98
答案 0 :(得分:2)
在您的代码中
n |= (n & 0X0000) | 0x6000;
是错误的,因为等于
0xABCDE98 & 0x0000 = 0
以及0x0000 | 0x6000 = 0x6000
和0xABCDE98 | 0x6000 = 0xABCFDE98
相反,你必须写
n = (n & 0XFFF0FFF) | 0x6000;
答案 1 :(得分:1)
变化:
n |= (n & 0X0000) | 0x6000;
为:
n &= ~0xd000;
n |= 0x6000;
或只是:
n = (n & ~0xd000) | 0x6000;
如果您愿意。
测试:
#include <stdio.h>
int main()
{
int n = 0xABCDE98;
n &= ~0x000d000; // clear nybble
n |= 0x0006000; // set nybble to 6
printf("%#x\n", n);
return 0;
}
编译并运行:
$ gcc -Wall temp.c && ./a.out
0xabc6e98
答案 2 :(得分:1)
试试这个:
#include<stdio.h>
int main()
{
int n = 0xABCDE98;
n = n ^ 0x000B000; //Ex-OR 'n' with 0x000B000
printf("%x\n", n);
return 0;
}
o/p - abc6e98
答案 3 :(得分:1)
让我们看一下你的程序正在做什么:
(n&amp; 0x0000)
真相表AND: 什么&amp; 0 = 0,因此结果只是0x0000
真相表或: 0 | Anything = Anything
所以现在(0x0000)| 0x6000 = 0x6000
有效的线: n | =(n&amp; 0X0000)| 0x6000;
简化为:
n | = 0x6000
n = D的第4位数
十六进制数学:D | 6 = F. 因此你的结果是0xABCFE98
解决方案? 您需要首先尝试0和D数字,然后使用0x6000将其设置为6.根据其他海报的建议,有很多方法可以做到这一点。
n =(n - 0xD000)| 0x6000也可以做到这一点。
答案 4 :(得分:0)
尝试以下
#include <stdio.h>
int main( void )
{
int x = 0XABCDE98;
x = ( ~0xF000 & x ) | 0x6000;
printf( "%#X\n", x );
return 0;
}
输出
0XABC6E98
答案 5 :(得分:0)
n & 0x0000
“删除”最后四位数字,因此请将其替换为n & 0xFFF0FFF
。除了第四个数字(0)之外,这将保留所有数字。