回答:
Cでは、ビット操作を非表示にする場合は、マクロを記述できます。
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
このように使用して、右端からn 番目のビットを確認します。
CHECK_BIT(temp, n - 1)
C ++では、std :: bitsetを使用できます。
!= 0
が正しいので、なぜわざわざ?1
とまったく同じ0.1415
です!
std::bitset
本当に?確かに、ほんの少しの作業(および場合によってはいくつかの本当に素晴らしいテンプレート)を実行して単一のビットをチェックするのではなく、(私の実装では)各 'ビット'を未使用の状態で格納する肥大化したコンテナーを使用しunsigned long
ます。なんてスペースの無駄だ!
ビットN(0から開始)が設定されているかどうかを確認します。
temp & (1 << N)
このための組み込み関数はありません。
1 << 0
か?すみません、混乱しています。
1<<0
され、任意のシフトせずに1である、(シフト0)、1<<0 == 1
C ++の場合は、std :: bitsetを使用します。シンプル。簡単です。愚かなエラーの可能性はありません。
typedef std::bitset<sizeof(int)> IntBits;
bool is_set = IntBits(value).test(position);
またはこの愚かさはどうですか
template<unsigned int Exp>
struct pow_2 {
static const unsigned int value = 2 * pow_2<Exp-1>::value;
};
template<>
struct pow_2<0> {
static const unsigned int value = 1;
};
template<unsigned int Pos>
bool is_bit_set(unsigned int value)
{
return (value & pow_2<Pos>::value) != 0;
}
bool result = is_bit_set<2>(value);
std::bitset<CHAR_BIT * sizeof(int)>
はさらに正確に
ええ、私は私がこの方法でそれをする必要がないことを知っています。しかし、私は通常書きます:
/* 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.
とりわけ、このアプローチ:
選択した答えが実際に行っていることは実際には間違っています。以下の関数は、ビットが実際に有効かどうかに応じて、ビット位置または0を返します。これはポスターが求めていたものではありません。
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
これがポスターが最初に探していたものです。以下の関数は、ビットが有効で位置ではない場合、1または0を返します。
#define CHECK_BIT(var,pos) (((var)>>(pos)) & 1)
bool has_feature = CHECK_BIT(register, 25);
ダブルネゲートなしで実行できることを知っておくと便利です。
このビットフィールドの説明によれば、フィールドを直接定義してアクセスする方法があります。このエントリの例は次のとおりです。
struct preferences {
unsigned int likes_ice_cream : 1;
unsigned int plays_golf : 1;
unsigned int watches_tv : 1;
unsigned int reads_books : 1;
};
struct preferences fred;
fred.likes_ice_cream = 1;
fred.plays_golf = 1;
fred.watches_tv = 1;
fred.reads_books = 0;
if (fred.likes_ice_cream == 1)
/* ... */
また、警告があります:
ただし、構造体のビットメンバーには実用上の欠点があります。まず、メモリ内のビットの順序はアーキテクチャに依存し、メモリパディングルールはコンパイラごとに異なります。さらに、多くの一般的なコンパイラは、ビットメンバーの読み取りと書き込みに非効率的なコードを生成します。ほとんどのマシンはメモリ内の任意のビットセットを操作できないため、ビットフィールド(特にマルチプロセッサシステム)に関連するスレッドセーフの問題が発生する可能性があります。代わりに、単語全体を読み込んで保存する必要があります。
std :: bitsetを使用する
#include <bitset>
#include <iostream>
int main()
{
int temp = 0x5E;
std::bitset<sizeof(int)*CHAR_BITS> bits(temp);
// 0 -> bit 1
// 2 -> bit 3
std::cout << bits[2] << std::endl;
}
temp
「ビッグエンディアン」にするために値を反映する必要はありませんか?
つまり、_bittest組み込み命令があります。
私はこれを使います:
#define CHECK_BIT(var,pos) ( (((var) & (pos)) > 0 ) ? (1) : (0) )
ここで、「pos」は2 ^ nとして定義されます(ig 1,2,4,8,16,32 ...)
戻り値:真の場合は1、偽の場合は0
4 = 2^(3-1)
これは質問の一部だったので、ビット位置3 に使用することを明示的に示す必要があります。
PDFのオブジェクトのフラグを定義する32ビット整数を読み取ろうとしましたが、これは機能しませんでした
それが定義を変更していたのを修正したもの:
#define CHECK_BIT(var,pos) ((var & (1 << pos)) == (1 << pos))
オペランド&は、両方が1にあるフラグを含む整数を返し、ブール値に正しくキャストされなかったため、これがうまくいきました
!= 0
同じことをします。生成された機械語命令がどのように異なるかわからない。
シフトとマスキングを「シミュレート」できます: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
std::cout << (((status & (1 << i)) ? '1' : '0');
。あなたは使用する必要があるCHAR_BIT
から定数を<climits>
この場合には、あなたが結果を知っているのに、あなたが使用しているので、とにかく8になります、代わりにハードコーディング8ビットのuint8_t
あなたが本当にハードコードされた方法が欲しいなら:
#define IS_BIT3_SET(var) ( ((var) & 0x04) == 0x04 )
このハードウェアに依存し、このビット順序は7654 3210であり、変数は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
今答えるのはかなり遅いですが、POWERとMODULUS数学演算子を使用するだけで、N番目のビットが設定されているかどうかを確認する簡単な方法があります。
「temp」にN番目のビットが設定されているかどうかを知りたいとしましょう。次のブール式は、ビットが設定されている場合はtrue、それ以外の場合は0になります。
次の例について考えてみます。
3番目のビットが設定されているかどうかを知りたい場合は、
したがって、式はtrueを返し、3番目のビットが設定されていることを示します。
1つのアプローチは、次の条件内でチェックすることです。
if ( (mask >> bit ) & 1)
説明プログラムは次のようになります:
#include <stdio.h>
unsigned int bitCheck(unsigned int mask, int pin);
int main(void){
unsigned int mask = 6; // 6 = 0110
int pin0 = 0;
int pin1 = 1;
int pin2 = 2;
int pin3 = 3;
unsigned int bit0= bitCheck( mask, pin0);
unsigned int bit1= bitCheck( mask, pin1);
unsigned int bit2= bitCheck( mask, pin2);
unsigned int bit3= bitCheck( mask, pin3);
printf("Mask = %d ==>> 0110\n", mask);
if ( bit0 == 1 ){
printf("Pin %d is Set\n", pin0);
}else{
printf("Pin %d is not Set\n", pin0);
}
if ( bit1 == 1 ){
printf("Pin %d is Set\n", pin1);
}else{
printf("Pin %d is not Set\n", pin1);
}
if ( bit2 == 1 ){
printf("Pin %d is Set\n", pin2);
}else{
printf("Pin %d is not Set\n", pin2);
}
if ( bit3 == 1 ){
printf("Pin %d is Set\n", pin3);
}else{
printf("Pin %d is not Set\n", pin3);
}
}
unsigned int bitCheck(unsigned int mask, int bit){
if ( (mask >> bit ) & 1){
return 1;
}else{
return 0;
}
}
出力:
Mask = 6 ==>> 0110 Pin 0 is not Set Pin 1 is Set Pin 2 is Set Pin 3 is not Set
#define CHECK_BIT(var,pos) ((var>>pos) & 1)
pos-0から始まるビット位置。
0または1を返します。