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 PellesCIDEを使用している

4

5 に答える 5

3

25511111111バイナリです。254、つまり11111110。?

于 2012-08-30T12:05:46.170 に答える
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 に答える
2

数字を2進数で書きましょう。

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

の最下位ビットはすでに1であるため、ビット単位またはのyおよびaはです。aa

のすべてのビットが1であるため、ビット単位およびx任意の8ビット数のは同じ8ビット数xです。最下位ビットを1に設定する場合は、ビット単位で11111110バイナリ=254を使用する必要があります。 10進数。書き出すのではなく、~ビット演算子を使用して計算を行うことができます。

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

あなたはいくつかのド・モルガンの法則を学ぶべきです

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を使用する場合は、2番目のオペランドのlsbのみを1にする必要があります。

Var ^ 1 ==>flips the lsb of Var

andnot and orのみを使用して反転する必要がある場合は 、さらにx3またはx4の計算を使用する必要があり(効率的ではありません)、これはエクササイズとしてあなたに任されています。

于 2012-08-30T12:11:33.073 に答える