在十六进制数中设置一个位
Setting a bit in hexadecimal number
给定一个数字 (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
变化:
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
试试这个:
#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
在你的代码中
n |= (n & 0X0000) | 0x6000;
是错误的,因为等于
0xABCDE98 & 0x0000 = 0
和 0x0000 | 0x6000 = 0x6000
和 0xABCDE98 | 0x6000 = 0xABCFDE98
你必须写成
n = (n & 0XFFF0FFF) | 0x6000;
尝试以下方法
#include <stdio.h>
int main( void )
{
int x = 0XABCDE98;
x = ( ~0xF000 & x ) | 0x6000;
printf( "%#X\n", x );
return 0;
}
输出为
0XABC6E98
n & 0x0000
"delete" 最后四位,所以用 n & 0xFFF0FFF
代替。这将保留除第四个数字(0)之外的所有数字。
让我们看看您的程序在做什么:
(n & 0x0000)
真相Table 并且:
Anything & 0 = 0,所以结果就是 0x0000
真相Table 或者:
0 |任何东西 = 任何东西
所以现在 (0x0000) | 0x6000 = 0x6000
有效行:
n |= (n & 0X0000) | 0x6000;
简化为:
n |= 0x6000
n的倒数第4位=D
十六进制数学:D | 6 = 女
因此你的结果是 0xABCFE98
解决方案?
您需要先尝试仅将 D 数字置为 0,然后使用 0x6000 或将其设置为 6。按照其他发帖人的建议,有很多方法可以做到这一点。
n = (n - 0xD000) | 0x6000 也可以解决问题。
给定一个数字 (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
变化:
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
试试这个:
#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
在你的代码中
n |= (n & 0X0000) | 0x6000;
是错误的,因为等于
0xABCDE98 & 0x0000 = 0
和 0x0000 | 0x6000 = 0x6000
和 0xABCDE98 | 0x6000 = 0xABCFDE98
你必须写成
n = (n & 0XFFF0FFF) | 0x6000;
尝试以下方法
#include <stdio.h>
int main( void )
{
int x = 0XABCDE98;
x = ( ~0xF000 & x ) | 0x6000;
printf( "%#X\n", x );
return 0;
}
输出为
0XABC6E98
n & 0x0000
"delete" 最后四位,所以用 n & 0xFFF0FFF
代替。这将保留除第四个数字(0)之外的所有数字。
让我们看看您的程序在做什么:
(n & 0x0000)
真相Table 并且: Anything & 0 = 0,所以结果就是 0x0000
真相Table 或者: 0 |任何东西 = 任何东西
所以现在 (0x0000) | 0x6000 = 0x6000
有效行: n |= (n & 0X0000) | 0x6000;
简化为:
n |= 0x6000
n的倒数第4位=D
十六进制数学:D | 6 = 女 因此你的结果是 0xABCFE98
解决方案? 您需要先尝试仅将 D 数字置为 0,然后使用 0x6000 或将其设置为 6。按照其他发帖人的建议,有很多方法可以做到这一点。
n = (n - 0xD000) | 0x6000 也可以解决问题。