在十六进制数中设置一个位

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

LIVE CODE

试试这个:

#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 = 00x0000 | 0x6000 = 0x60000xABCDE98 | 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 也可以解决问题。