-5

私はCが初めてで、CIでビットごとの演算子がどのように機能するかを学び、アドレスの最上位が設定されているかどうかを確認したかった

  int main()
  {

   int addr=0x0fffffff;

   if(addr&0x80)
   {
      Printf("Bit is set");
   }
    else
     printf("Bit is not set");
     return 0;
   }

編集: 0x80 を 1000 0000 0000 0000 0000 0000 0000 0000 として表現したいのですが、マクロを使用してすべてのビットを書き込む必要がない過去にそのような実装を見たことがありますが、どこでそれを思い出すことができませんか?

4

4 に答える 4

2

あなたのコード int addr=0x0fffffff; if(addr&0x80) は、この条件を常に true にします。

0x0fffffff  => 0000 1111 1111 1111 .... 1111 1111
where 0x80  =>                          1000 0000
-------------------------------------------------
bitwise AND                             1000 0000 -> non zero means true!
于 2013-10-05T08:02:24.163 に答える
1

cすべてのnon zero値はですtrue。したがって、あなたの条件は真になります。

あなたの状態は次のように評価されます10000000b = 128 = true

于 2013-10-05T08:02:17.753 に答える
1

マスク ~(~0U >> 1) を使用して、最上位ビットが設定されているかどうかを確認できます。これはあなたのものから適応されたいくつかのコードです:

#include <stdio.h>

int main() {
    int addr=0x0fffffff;
    unsigned int mask = ~(~0U >> 1);

    if (addr & mask) {
        printf("Bit is set");
    }
    else
        printf("Bit is not set");
    return 0;
}

C は初めてなので、マスクは少し奇妙に見えるかもしれません。ここで何が起こっているか見てみましょう。

~0U は、すべてのビットが 1 に設定された符号なしの数値です。単項 ~ 演算子は、0 のすべてのビットを否定するため、すべてのビットが 1 になります。~0U >> 1 は、すべてを 1 桁分右にシフトするため、(on 32 ビット マシン):

01111111111111111111111111111111

~(~0U >> 1) であるすべてをもう一度否定すると、次のようになります。

10000000000000000000000000000000

これで、最上位ビットのみが設定された数値が得られました。これは、他の数値をテストするためのマスクとして使用されます。

数値のサイズに依存していないため、この種の構造を使用すると移植性があります。~(~0U >> 1) は、int のビット数に関係なく常に機能します。

数値は、右シフト演算子が通常の int で符号拡張を引き起こす可能性があるため、unsigned であると宣言されていますが、これは望ましくありません。符号なしの数値では、右シフトは常に先頭に 0 を挿入します。

于 2013-10-05T08:33:20.557 に答える
0

if(addr&0x80)  

conditionaddr&0x80は true を保持し ( にゼロ以外の値を返しますif)、これは次と同等です

if( a nonzero value) // any nonzero value treated as true

印刷するのはそのためですBit is set

于 2013-10-05T07:58:16.033 に答える