2017-11-27 4 views
1

私は16進値を持っているからビットをカウントする方法を、私は(1の)は、複数のHexidecimals

#I have tried this 

val = hex(bus.read_port(0))+hex(bus.read_port(1)) #There are 16 ports. 

#read port returns a Decimal (0-255) 
#val is 0x3f0xff 

def bitCount(val): 
    count = bin(val).count('1') 
    return (count) 

#bitCount() Returns 6 instead of 14 

の総ビット数をカウントする必要がある。しかし、それは唯一の最初のバイトのビットを返します。 返品前にvalを印刷しています。 0x3f0xff 私が必要とするのは3F00FFです(各16進数のバイナリ値を1つの16進数にまとめて文字列にします) または、組み合わせたビット数を読み取る別の方法です。 10の数を取得

これは動作するように見えたが、私が代わりに16 bus.write_port(0、0xFFで)の10を得 bus.write_port(1、0xFFで)

def popcount255(k): 
    k = (k & 15) + (k >> 4) 
    k = (k & 3) + (k >> 2) 
    return (k & 1) + (k >> 1) 

def bitCount(): 
    result = popcount255(bus.read_port(0)) + popcount255(bus.read_port(1)) 
    return (result) 

if True: 
    print "BitCount ", bitCount() 

イム?

この

は今働いている

def bitCount(): 
    result = bin(bus_1.read_port(0)).count('1') + bin(bus_1.read_port(1)).count('1') 
return (result) 
+1

「0x3f0xff」は意味がありません。 –

+0

@ WillemVanOnsemのメソッドを動作させる方法については、元の質問をバックアップし、その後に追加のコードと質問を付けると便利です。 – scrpy

答えて

0

あなただけのストレートバイナリSTRIに両方の値を変換し、ビット数を取得するために16進文字列に変換する必要はありませんあなたが本当にあなたの元bitCount()関数に渡すval = '0x3FFF'を計算したい場合は、あなたが行うことができ、また

bitCount = bin(bus.read_port(0)).count('1') + bin(bus.read_port(1)).count('1') 

:NGS、それぞれに1秒をカウントし、2つの結果を追加

val = hex((bus.read_port(0) << 8) + bus.read_port(1)) 

どのこのように動作します:

あなたは2進文字列を連結してやっていた何を
--> hex((0x3F << 8) + 0xFF) 
    --> hex(0x3F00 + 0xFF) 
    --> hex(0x3FFF) 
    --> '0x3FFF' 

、したがって、あなたの問題:

val = hex(bus.read_port(0)) + hex(bus.read_port(0)) 

    --> hex(0x3F) + hex(0xFF) 
    --> '0x3F' + '0xFF'  # string concatenation 
    --> '0x3F0xFF'    # not '0x3FFF', extra '0x' in the middle 

'0x3F0xFF'が進数(bin()を使用してバイナリに変換しようとしているが、唯一の理由count('1')6を返したため、途中で予期せぬ'0x'前に最初の'0x3F'の部分を見ていた)の有効なストリング表記はないことに注意してください。

+0

ありがとうございます私はしたいことを完璧に、あなたはそれをそうすることができることを理解していませんでした。 – Zika

+0

助けてくれてうれしい!それがあなたに役立ったと感じたら、[私の答えを受け入れる](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)を自由に感じてください:-) – scrpy

2

ここにいくつかの奇妙なものがあります:あなたは、設定されたビットをカウントしていない問題でない数は10進数、または16進数として表現されているかどうか

  1. は、。
  2. hex(..)を使用すると、文字列に変換されます。
  3. これらの文字列を連結して、結果を16進数ではない値にします。

我々はO(kはログ)に255までの値についてpopcount(または定数Kビット)を実装することができます:だから私たちは、その後カウントするように、この機能を使用することができます

def popcount255(k): 
    k = (k & 85) + ((k & 170) >> 1) 
    k = (k & 51) + ((k & 204) >> 2) 
    return (k & 15) + ((k & 240) >> 4) 

設定ビット:

result = popcount255(bus.read_port(0)) + popcount255(bus.read_port(1))
+0

私はあなたの方法を試しています。 – Zika

+0

あなたの 'popcount255'に何か問題があると思います。 'popcount255(0b111)'は私に2を与えます。 OPの 'bin(k).count( '1')'は、あなたが 'int'を与えている間は、私には大丈夫です。 –

+0

@PaulPanzer:あなたは正しいです。アルゴリズムを多かれ少なかれ逆に実装しました。今すぐ修正する必要があります。 –

関連する問題