协助基本位操作

时间:2010-02-04 12:08:08

标签: c bit-manipulation

这是我之前回答的问题的后续问题:

Reading characters on a bit level

我似乎遇到的问题是理解C中位操作的基本概念。我理解需要做什么,但我实际上在开发解决方案时遇到了麻烦。

一个例子:

使用逻辑运算符将01101010更改为00111110。

我理解掩码的原理和需要来实现解决方案,但我不明白如何以编程方式进行。

我来自一个基于C#的大量背景,最近才开始用C语言开发。

有人可以给我一些指示或提示来完成这个例子吗?

以下是任何其他人认为有用的解决方案:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h.>

int main()
{
    //01101010 - 106 Decimal
    char a = 0x6A;

    //01010100 - 84 Decimal
    char b = 0x54;

    //00111110 - Uses exclusive or (XOR)
    char c = a ^ b;

    //Prints out in Hex - 62 Decimal
    printf("%x",c);

    return 0;
}

2 个答案:

答案 0 :(得分:2)

你可以把它们排在一起。如果其中一个位是1,则两位的XOR为1.

    01101010
XOR 00111110
=
    01010100

使用此结果对第一个值进行异或运算将为您提供第二个值。

    01101010
XOR 01010100
=   00111110

在C:

char a = 0x6A;
char b = 0x3E;
char c = a ^ b;

(c ^ a == a ^ b ^ a) && (a ^ b ^ a == b)

答案 1 :(得分:2)

我会这样做:首先看看哪些位需要改变。如果您只需要将1更改为0,则需要&。如果您只需要将0更改为1,则需要|。如果您需要在两个方向上进行更改,例如此处的情况,则需要^,因为它是唯一可以双向运行的运算符,可以这么说。

现在只需要找到适合xor的位掩码。从1^0=10^0=0开始,您必须在位掩码中将您不想更改的位设置为0。将其他人设为1(1^1为0且0^1为1),您将获得所需的结果。