2017-11-27 1 views
1

내가 16 개 진수 값이에서 비트를 계산하는 방법, I (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 

비트의 총 수를 계산해야하지만, 그것은 단지 첫 번째 바이트의 비트를 반환합니다. 반품 전 반품 인쇄. 예 : 0x3f0xff 내가 필요로하는 것은 3F00FF입니다 (한 16 진수로 함께 묶인 각 16 진수의 이진 값) 또는 다른 방법으로 결합 된 비트 수를 읽을 수 있습니다.

이 작동 듯하지만 난 대신 16 bus.write_port 10 (0, 0xFF로) 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() 

임 (10)의 개수를 얻는거야?

지금 노력하고 있습니다

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

당신은 바이너리 스트 바로 두 값을 변환, 비트 수를 얻을 수있는 16 진수 문자열로 변환 할 필요가 없습니다 NGS, 각각의 1 초를 계산하고,이 개 결과를 추가 : 당신이 정말로 원래 bitCount() 기능에 전달 val = '0x3FFF'를 계산하려면,

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

양자 택일로, 당신은 할 수 :

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

어떤 다음과 같이 작동

두 진수 문자열을 연결 한하고 있던 무엇
--> hex((0x3F << 8) + 0xFF) 
    --> hex(0x3F00 + 0xFF) 
    --> hex(0x3FFF) 
    --> '0x3FFF' 

, 따라서 귀하의 문제 :

,691,363 '0x3F0xFF'는 16 진수의 캐릭터 라인 표현으로서 무효이다 (210)
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 

주 (count('1')6을 반환 한 이유만을 따라서, 중간에 예상치 못한 '0x' 전에 첫 번째 '0x3F' 부분을보고 있었다 bin()를 사용하여 이진로 변환하려고) .

+0

그게 고마워요 내가하고 싶은 일을 완벽하게, 당신이 그것을 그렇게 할 수 있다는 것을 깨닫지 못했습니다. – Zika

+0

도움이 된 것을 기쁘게 생각합니다! 자신에게 유용하다고 생각한다면 [내 대답 수락] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)을 자유롭게 할 수 있습니다 :-) – scrpy

2

여기에 몇 가지 이상한 일들이 있습니다 : 당신이 설정 한 비트를 계산 문제가되지 않는 수가 진수 또는 16 진수로 표시되어 있는지 여부를

  1. 가;
  2. hex(..)을 사용하여 문자열로 변환하십시오.
  3. 나중에 이러한 문자열을 연결하여 16 진수 값이 아닌 결과를 만듭니다.

우리 O (K 로그)의 값에 대한 popcount 255 위 (또는 일정한 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')'는 내게는 괜찮은 것처럼 보입니다. –

+0

@PaulPanzer : 정확합니다. 나는 그 알고리즘을 어느 정도 반대로 구현했다. 이제는 고쳐야합니다. –