设置十六进制数位

时间:2015-06-12 10:12:26

标签: c bit-manipulation bit

给定一个数字(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

6 个答案:

答案 0 :(得分:2)

在您的代码中

n |= (n & 0X0000) | 0x6000;

是错误的,因为等于

0xABCDE98 & 0x0000 = 0以及0x0000 | 0x6000 = 0x60000xABCDE98 | 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

LIVE CODE

答案 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)之外,这将保留所有数字。