120
int temp = 0x5E; // in binary 0b1011110.

ビットシフトとマスキングなしで、temp のビット 3 が 1 か 0 かを確認する方法はありますか。

このための組み込み関数があるかどうか、または自分で作成する必要があるかどうかを知りたいだけです。

4

23 に答える 23

179

C では、ビット操作を隠したい場合は、マクロを記述できます。

#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))

次のように使用して、右端からn番目のビットをチェックします。

CHECK_BIT(temp, n - 1)

C++ では、 std::bitsetを使用できます。

于 2009-02-07T13:16:29.017 に答える
98

ビット N (0 から開始) が設定されているかどうかを確認します。

temp & (1 << N)

このための組み込み関数はありません。

于 2009-02-07T13:15:09.270 に答える
14

ええ、私はこのようにする「必要」がないことを知っています。しかし、私は通常次のように書いています。

    /* Return type (8/16/32/64 int size) is specified by argument size. */
template<class TYPE> inline TYPE BIT(const TYPE & x)
{ return TYPE(1) << x; }

template<class TYPE> inline bool IsBitSet(const TYPE & x, const TYPE & y)
{ return 0 != (x & y); }

例えば:

IsBitSet( foo, BIT(3) | BIT(6) );  // Checks if Bit 3 OR 6 is set.

とりわけ、このアプローチは次のとおりです。

  • 8/16/32/64 ビット整数に対応。
  • 私の知識と同意なしに IsBitSet(int32,int64) 呼び出しを検出します。
  • インライン化されたテンプレートなので、関数呼び出しのオーバーヘッドはありません。
  • const&参照なので、複製/コピーする必要はありません。また、コンパイラが引数を変更しようとするタイプミスを検出することが保証されています。
  • 0!=は、コードをより明確かつ明白にします。コードを書く際の主なポイントは、スキルの低いプログラマーを含め、他のプログラマーと明確かつ効率的にコミュニケーションを取ることです。
  • この特定のケースには当てはまりませんが... 一般に、テンプレート化された関数は、引数を複数回評価する問題を回避します。一部の #define マクロに関する既知の問題。
    例: #define ABS(X) (((X)<0) ? - (X) : (X))
          ABS(i++);
于 2009-02-07T16:13:10.453 に答える
7

Bitset を使用できます - http://www.cppreference.com/wiki/stl/bitset/start

于 2009-02-07T13:14:09.630 に答える
4

PDFでオブジェクトのフラグを定義する32ビット整数を読み取ろうとしましたが、これは機能しませんでした

何がそれが定義を変更していたのを修正しました:

#define CHECK_BIT(var,pos) ((var & (1 << pos)) == (1 << pos))

オペランド&は、両方が1にあるフラグを持つ整数を返しますが、ブール値に適切にキャストされていませんでした。これにより、トリックが実行されました。

于 2012-05-15T12:51:08.070 に答える
2

低レベルの x86 固有のソリューションには、x86 TESTオペコードを使用します。

ただし、コンパイラは_bittestをこれに変換する必要があります...

于 2009-02-09T16:35:46.873 に答える
1

シフトとマスキングを「シミュレート」できます: if((0x5e/(2*2*2))%2) ...

于 2009-02-07T13:16:36.147 に答える
1

このような単純なものを使用してみませんか?

uint8_t status = 255;
cout << "binary: ";

for (int i=((sizeof(status)*8)-1); i>-1; i--)
{
  if ((status & (1 << i)))
  {
    cout << "1";
  } 
  else
  {
    cout << "0";
  }
}

出力: バイナリ:11111111

于 2013-10-15T15:37:27.870 に答える
0

本当にハードコードされた方法が必要な場合:

 #define IS_BIT3_SET(var) ( ((var) & 0x04) == 0x04 )

このハードウェア依存に注意してください。このビット順序は 7654 3210 であり、var は 8 ビットであると想定しています。

#include "stdafx.h"
#define IS_BIT3_SET(var) ( ((var) & 0x04) == 0x04 )
int _tmain(int argc, _TCHAR* argv[])
{
    int temp =0x5E;
    printf(" %d \n", IS_BIT3_SET(temp));
    temp = 0x00;
    printf(" %d \n", IS_BIT3_SET(temp));
    temp = 0x04;
    printf(" %d \n", IS_BIT3_SET(temp));
    temp = 0xfb;
    printf(" %d \n", IS_BIT3_SET(temp));
    scanf("waitng %d",&temp);

    return 0;
}

結果:

1 0 1 0

于 2009-02-07T14:30:59.380 に答える
-2

最速の方法はマスクのルックアップテーブルのようです

于 2010-11-23T10:37:56.043 に答える