2012-02-19 15 views
0

私は簡単な質問があります。C++のIntビット操作は2UL = 10ULですか?

私はしばらくの間、C/C++でのビット操作で遊んでてきたと私は最近、私は定期的にunsigned int型に2ULと10ULを比較したとき、彼らは同じビットを返すように見えることを発見しました。例えば

#define JUMP 2UL 
#define FALL 10UL 

unsigned int flags = 0UL; 
this->flags |= FALL; 

//this returns true 
this->is(JUMP); 

bool Player::is(const unsigned long &isThis) 
{ 
return ((this->flags & isThis) == isThis); 
} 

は、2Uの10Uに等しく、もしそうならば、私は、単一の符号なし整数に8つ以上(?)のフラグが必要な場合、どのように私はその周りに行くだろうご確認ください。

敬具、もちろん

-Markus

答えて

5

10ulはバイナリで1010であり、2は10です。したがって、x |= 10を実行すると2番目のビットも設定されます。

あなたはおそらく、あなたのフラグとして0x100x2を使用していました。これらはあなたの期待通りに機能します。余談として

:16進表記で一桁は、バイナリで4ビットではなく8

+0

ああ、今私はそれを手に入れます。ありがとう! – Orujimaru

+0

それでは、私が欲しいが、私はどうなるのか1,2,4,8,16など では1UL、2^1UL、2^2UL、2^3ULです。 しかし、私は期待どおりに動作しません。 512UL、1024ULなどよりも、これらの値を明確に定義する方法はありますか? – Orujimaru

+0

@Orujimaru: '1UL << k'おそらく? – Fanael

1
JUMP, 2: 0010 
FALL, 10: 1010 

FALL & JUMP = JUMP = 0010 
1

進数2を表す小数10は場合バイナリ1010であるのに対し、もしビット単位、およびそれら、0010である(2 & 10) 、それはとても10 & 2が2に確かに等しい多分あなたの意図は、それぞれのビット数2と10だろうこれ、1ul << 21ul << 10のためにテストすることで、バイナリ0010、または小数2を生成します。あるいは、0x10と表記される16進数の10(10進数16、2進数10000)を使用することを意図していたかもしれません。

+0

おかげで、1ULよう<< 10は0X10と等しくありませんか? – Orujimaru

+0

いいえ、まったくありません。 '1U << 0u'が' 1U << 1u' 2(0000 0000 00010、0x2の)、 '1U << 2u'が4(0000 0000 0100を0x4)であり、1(バイナリ0000 0001 0000、六角は0x1)であり、等々。従って、「1u << 10u」は1024(0100 0000 0000、0x400)である。 – pmdj