int temp = 0x5E; // in binary 0b1011110.
ビットシフトとマスキングなしで、temp のビット 3 が 1 か 0 かを確認する方法はありますか。
このための組み込み関数があるかどうか、または自分で作成する必要があるかどうかを知りたいだけです。
int temp = 0x5E; // in binary 0b1011110.
ビットシフトとマスキングなしで、temp のビット 3 が 1 か 0 かを確認する方法はありますか。
このための組み込み関数があるかどうか、または自分で作成する必要があるかどうかを知りたいだけです。
C では、ビット操作を隠したい場合は、マクロを記述できます。
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
次のように使用して、右端からn番目のビットをチェックします。
CHECK_BIT(temp, n - 1)
C++ では、 std::bitsetを使用できます。
ビット N (0 から開始) が設定されているかどうかを確認します。
temp & (1 << N)
このための組み込み関数はありません。
ええ、私はこのようにする「必要」がないことを知っています。しかし、私は通常次のように書いています。
/* 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.
とりわけ、このアプローチは次のとおりです。
Bitset を使用できます - http://www.cppreference.com/wiki/stl/bitset/start。
PDFでオブジェクトのフラグを定義する32ビット整数を読み取ろうとしましたが、これは機能しませんでした
何がそれが定義を変更していたのを修正しました:
#define CHECK_BIT(var,pos) ((var & (1 << pos)) == (1 << pos))
オペランド&は、両方が1にあるフラグを持つ整数を返しますが、ブール値に適切にキャストされていませんでした。これにより、トリックが実行されました。
シフトとマスキングを「シミュレート」できます: if((0x5e/(2*2*2))%2) ...
このような単純なものを使用してみませんか?
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
本当にハードコードされた方法が必要な場合:
#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
最速の方法はマスクのルックアップテーブルのようです