2

我想将 uint 的 lsb 从 1 翻转到 0,反之亦然 有人能告诉我为什么下面的代码与 & 和 | 的结果相同吗?手术。

#include<stdio.h>
#include<stdint.h>
int main()
{
    uint8_t a=53;
    uint8_t x=255; //     AND BY 255 TO insert 0 at LSB position 11111110
    uint8_t y=1;   //      OR BY   1 TO insert 1 at LSB position 00000001

    uint8_t b=a&x;
    uint8_t c=a|y;

    printf("\nValue of byte a : %d",a );
    printf("\nValue of byte b : %d",b );
    printf("\nValue of byte c : %d",c );
    getchar();
    return 0;
}

a、b的值怎么能一样,即53我用的是Pelles C IDE

4

5 回答 5

3

25511111111二进制的。你想要 254 即11111110。?

于 2012-08-30T12:05:46.170 回答
2

你应该学习一些 de-Morgan 规则

X and 1 = X
X and 0 = 0
X or  1 = 1
X or  0 = X
X xor 0 = X
X xor 1 = not X   ---> this is the flipping so you need Var^1   (^means xor)
not ( X and Y) = (not X) or (not Y)
not ( X or Y ) = (not X) and (not Y)
X or Y = not ( (not X) and (not Y) )

其中 X 是变量的 lsb。

255 的 lsb 也是 1,1 的 lsb 也是 1

所以,

53 & 255 => lsb=1 because both lsb's are 1 
53 | 1 => lsb=1 because any one of the lsb's are 1

如果要翻转 lsb,则如果使用xor ,则只有第二个操作数的 lsb 需要为 1

Var ^ 1 ==>flips the lsb of Var

如果您只需要使用and而不是and or来翻转 ,那么您需要使用 x3 或 x4 更多的计算(效率不高),这留给您作为 excersize。

于 2012-08-30T12:11:33.073 回答
2

让我们用二进制写出数字:

        a = 00010011
        x = 11111111
        y = 00000001
b = a & x = 00010011
c = a | y = 00010011

和的按位或是y,因为 的最低有效位已经是 1。aaa

任何 8 位数字的按位与x是相同的 8 位数字,因为 的所有位x都是 1。如果要将最低有效位设置为 1,则需要按位与 11111110 二进制 = 254十进制。~您可以使用按位运算符进行计算,而不是将其写出来。

uint8_t x = ~1;
uint8_t b = a & x;
于 2012-08-30T12:10:05.613 回答
2

您如何期望通过与所有的与来在 LSB 处插入 0?

于 2012-08-30T12:05:35.723 回答
2

53 二进制: 00110101

255 二进制:11111111

1 二进制: 00000001

所以,

a & x = 00110101 & 11111111 = 00110101 = 53

a | y = 00110101 | 00000001 = 00110101 = 53
于 2012-08-30T12:06:46.743 回答