2016-08-16 8 views
3

私は、ビットマスクを介してコマンドに応答するためにグループ化できるいくつかのノードを持っています。たとえば、NodeAはグループ1とグループ5に属しています。どのグループに属しているかを尋ねると、17でバイナリに相当する「0b10001」が返されます。グループ2,7および9のノードは、それがグループ322( '0b101000010')に属していることを示します。指定されたノードがどのグループに属しているかをユーザーに表示する方法が必要です。 16グループの可能性があります。バイナリが16文字でない場合、私のコードは「文字列インデックスが範囲外です」エラーを返します。私はより良い方法があります知っている:(!やループ)pythonビットマスク内で1を見つける

def xref(grp): 
    a = bin(grp) 
    d = str(a) 
    if d[-1] == '1': 
     print "Group 1" 
    if d[-2] == '1': 
     print "Group 2" 
    if d[-3] == '1': 
     print "Group 3" 
repeat for 16 groups 
+0

ビット演算子を使用できないのはなぜですか? – soon

+1

単純なforループを持つビット演算子はおそらく正しい方法ですが、既存のコードを動作させるには 'd'が常に16文字の長さであることを確認する必要があります。これを行うには 'zfill'関数を使います。次のように: 'bin(grp)[2:] .zfill(16)'。このコードは、 'grp'が(' 0: 'prexifを切り捨てる' [2:] 'のために)非負であると仮定しています。 – Qwrk

答えて

2

使用ビット操作は:

>>> for i in range(16): 
... if grp & (1<<i): 
... print('Group', i+1) 
+0

あなたは私にそれを打つ。 :-) –

3

あなただけのいくつかの基本的なbitwise operatorsを使用する必要があります。

def findbits(num): 
    for i in range(16): 
    if num & 1 << i: 
     print("Group {0}".format(i + 1)) 

と結果:これは何

 
>>> findbits(0b10001) 
Group 1 
Group 5 

>>> findbits(0b10100010) 
Group 2 
Group 6 
Group 8 

>>> findbits(0b101000010) 
Group 2 
Group 7 
Group 9 

はあなたが見てみたい16ビットをループで

は、ここでの例です。

  • 1 << iは、iビットで1をシフトします。二つのオペランドのビットが1

あるだから何これが行うこと0B1に対するあなたの値を比較した場合の数の各ビットが1に設定されている - 1 << 4は、ビット単位のANDを行いどんな0b10000

  • NUM &だろう、0b10,0b100など

  • +0

    パーフェクト!これはまさに私が望んでいたように機能しました。ありがとうございました。 –

    関連する問題