복붙노트

[PYTHON] 파이썬 : 비트 수 설정 (popcount)

PYTHON

파이썬 : 비트 수 설정 (popcount)

내 데이터베이스 (Oracle 11g)에 중복 된 BLOB가 없으며 UTL_RAW.BIT_XOR을 사용하여 BLOB에 XOR 연산을 수행했습니다. 그 후, 바이너리 문자열에서 비트 수를 세고 싶었 기 때문에 위 코드를 작성했습니다.

작은 실험 동안, 나는이 프로 시저와 생성 된 16 진수와 정수 값이 무엇인지보고 싶었습니다.

SQL> declare
2
3 vblob1 blob;
4
5 BEGIN
6
7 select leftiriscode INTO vblob1 FROM irisdata WHERE irisid=1;
8
9 dbms_output.put_line(rawtohex(vblob1));
10
11
12 dbms_output.put_line(UTL_RAW.CAST_TO_binary_integer(vblob1));
13
14
15 END;
16 /

출력 : HEXVALUE :

0F0008020003030D030C1D1C3C383C330A3311373724764C54496C0A6B029B84840547A341BBA83D
BB5FB9DE4CDE5EFE96E1FC6169438344D604681D409F9F9F3BC07EE0C4E0C033A23B37791F59F84F
F94E4F664E3072B0229DA09D9F0F1FC600C2E380D6988C198B39517D157E7D66FE675237673D3D28
3A016C01411003343C76740F710F0F4F8FE976E1E882C186D316A63C0C7D7D7D7D397F016101B043
0176C37E767C7E0C7D010C8302C2D3E4F2ACE42F8D3F3F367A46F54285434ABB61BDB53CBF6C7CC0
F4C1C3F349B3F7BEB30E4A0CFE1C85180DC338C2C1C6E7A5CE3104303178724CCC5F451F573F3B24
7F24052000202003291F130F1B0E070C0E0D0F0E0F0B0B07070F1E1B330F27073F3F272E2F2F6F7B
2F2E1F2E4F7EFF7EDF3EBF253F3D2F39BF3D7F7FFED72FF39FE7773DBE9DBFBB3FE7A76E777DF55C
5F5F7ADF7FBD7F6AFE7B7D1FBE7F7F7DD7F63FBFBF2D3B7F7F5F2F7F3D7F7D3B3F3B7FFF4D676F7F
5D9FAD7DD17F7F6F6F0B6F7F3F767F1779364737370F7D3F5F377F2F3D3F7F1F2FE7709FB7BCB77B
0B77CF1DF5BF1F7F3D3E4E7F197F571F7D7E3F7F7F7D7F6F4F75FF6F7ECE2FFF793EFFEDB7BDDD1F
FF3BCE3F7F3FBF3D6C7FFF7F7F4FAF7F6FFFFF8D7777BF3AE30FAEEEEBCF5FEEFEE75FFEACFFDF0F
DFFFF77FFF677F4FFF7F7F1B5F1F5F146F1F1E1B3B1F3F273303170F370E250B

INTEGER VALUE: 15

생성 된 정수 값과 16 진수 코드 사이에 차이가 있었기 때문에 다음 파이썬 코드를 사용하여 실제 정수 값을 확인했습니다.

print int("0F0008020003030D030C1D1C3C383C330A3311373724764C54496C0A6B029B84840547A341BBA83D
BB5FB9DE4CDE5EFE96E1FC6169438344D604681D409F9F9F3BC07EE0C4E0C033A23B37791F59F84F
F94E4F664E3072B0229DA09D9F0F1FC600C2E380D6988C198B39517D157E7D66FE675237673D3D28
3A016C01411003343C76740F710F0F4F8FE976E1E882C186D316A63C0C7D7D7D7D397F016101B043
0176C37E767C7E0C7D010C8302C2D3E4F2ACE42F8D3F3F367A46F54285434ABB61BDB53CBF6C7CC0
F4C1C3F349B3F7BEB30E4A0CFE1C85180DC338C2C1C6E7A5CE3104303178724CCC5F451F573F3B24
7F24052000202003291F130F1B0E070C0E0D0F0E0F0B0B07070F1E1B330F27073F3F272E2F2F6F7B
2F2E1F2E4F7EFF7EDF3EBF253F3D2F39BF3D7F7FFED72FF39FE7773DBE9DBFBB3FE7A76E777DF55C
5F5F7ADF7FBD7F6AFE7B7D1FBE7F7F7DD7F63FBFBF2D3B7F7F5F2F7F3D7F7D3B3F3B7FFF4D676F7F
5D9FAD7DD17F7F6F6F0B6F7F3F767F1779364737370F7D3F5F377F2F3D3F7F1F2FE7709FB7BCB77B
0B77CF1DF5BF1F7F3D3E4E7F197F571F7D7E3F7F7F7D7F6F4F75FF6F7ECE2FFF793EFFEDB7BDDD1F
FF3BCE3F7F3FBF3D6C7FFF7F7F4FAF7F6FFFFF8D7777BF3AE30FAEEEEBCF5FEEFEE75FFEACFFDF0F
DFFFF77FFF677F4FFF7F7F1B5F1F5F146F1F1E1B3B1F3F273303170F370E250B",16)

대답:

611951595100708231079693644541095422704525056339295086455197024065285448917042457
942011979060274412229909425184116963447100932992139876977824261789243946528467423
887840013630358158845039770703659333212332565531927875442166643379024991542726916
563271158141698128396823655639931773363878078933197184072343959630467756337300811
165816534945075483141582643531294791665590339000206551162697220540050652439977992
246472159627917169957822698172925680112854091876671868161705785698942483896808137
210721991100755736178634253569843464062494863175653771387230991126430841565373390
924951878267929443498220727531299945275045612499928105876210478958806304156695438
684335624641395635997624911334453040399012259638042898470872203581555352191122920
004010193837249388365999010692555403377045768493630826307316376698443166439386014
145858084176544890282148970436631175577000673079418699845203671050174181808397880
048734270748095682582556024378558289251964544327507321930196203199459115159756564
507340111030285226951393012863778670390172056906403480159339130447254293412506482
027099835944315172972281427649277354815211185293109925602315480350955479477144523
387689192243720928249121486221114300503766209279369960344185651810101969585926336
07333771272398091

세트 비트 수를 얻으려면 다음 코드를 C로 작성했습니다.

int bitsoncount(unsigned x)
{
    unsigned int b=0;
    if(x > 1)
        b=1;    
    while(x &= (x - 1))
        b++;    
    return b;
}

파이썬에서 같은 코드를 시도했을 때 작동하지 않았다. 호기심을 통해 파이썬에 익숙하지 않은 나는 실험하고있어, 틀렸다면 실례합니다.

def bitsoncount(x):
b=0;
if(x>1):
b=1;
while(x &= (x-1)):

마지막 줄에서 오류가 발생하고이를 해결하고 Python에서 로직을 구현하는 데 도움이 필요하다.

파이썬에서 세트 비트 버전을 확인하는 데 관심이있었습니다.

고맙습니다, 차이 타이 야

관련 질문 : 32 비트 정수에서 세트 비트의 수를 계산하는 최상의 알고리즘?

해결법

  1. ==============================

    1.파이썬 2.6 또는 3.0 :

    파이썬 2.6 또는 3.0 :

    def bitsoncount(x):
        return bin(x).count('1')
    

    예:

    >>> x = 123
    >>> bin(x)
    '0b1111011'
    >>> bitsoncount(x) 
    6
    

    또는

    파이썬에서 Matt Howells의 답변 :

    def bitsoncount(i):
        assert 0 <= i < 0x100000000
        i = i - ((i >> 1) & 0x55555555)
        i = (i & 0x33333333) + ((i >> 2) & 0x33333333)
        return (((i + (i >> 4) & 0xF0F0F0F) * 0x1010101) & 0xffffffff) >> 24
    
  2. ==============================

    2.당신이 찾고있는 것을 해밍 무게라고합니다.

    당신이 찾고있는 것을 해밍 무게라고합니다.

    파이썬 2.6 / 3.0에서는 다음과 같이 쉽게 찾을 수 있습니다.

    bits = sum( b == '1' for b in bin(x)[2:] )
    
  3. ==============================

    3.어떤 버전의 파이썬을 사용하고 있습니까? 우선, 파이썬은 세미콜론이 아닌 공백을 사용하기 때문에, 다음과 같이 시작해야합니다 ...

    어떤 버전의 파이썬을 사용하고 있습니까? 우선, 파이썬은 세미콜론이 아닌 공백을 사용하기 때문에, 다음과 같이 시작해야합니다 ...

      def bitsoncount(x): 
          b=0
          while(x > 0):
              x &= x - 1   
              b+=1
          return b
    
  4. ==============================

    4.C 알고리즘의 직접 변환은 다음과 같습니다.

    C 알고리즘의 직접 변환은 다음과 같습니다.

    def bitsoncount(x):
        b = 0
        while x > 0:
            x &= x - 1
            b += 1
        return b
    
  5. ==============================

    5.어쩌면이게 무슨 뜻일까요?

    어쩌면이게 무슨 뜻일까요?

    def bits_on_count(x):
        b = 0
        while x != 0:
            if x & 1: # Last bit is a 1
                b += 1
            x >>= 1 # Shift the bits of x right
        return b
    

    Python 3.0에서 간단히 할 수있는 방법이 있습니다.

    def bits_on_count(x):
      return sum(c=='1' for c in bin(x))
    

    이것은 bin (x)가 x의 이진 표현을 제공한다는 사실을 사용합니다.

  6. ==============================

    6.이 모듈을 사용해보십시오 :

    이 모듈을 사용해보십시오 :

    import sys
    if sys.maxint < 2**32:
        msb2= 2**30
    else:
        msb2= 2**62
    BITS=[-msb2*2] # not converted into long
    while msb2:
        BITS.append(msb2)
        msb2 >>= 1
    
    def bitcount(n):
        return sum(1 for b in BITS if b&n)
    

    이것은 기계 정수 (OS와 Python 버전에 따라 다름)에서 작동해야합니다. 그것은 오랫동안 작동하지 않습니다.

  7. ==============================

    7.어떻게이게 좋니?

    어떻게이게 좋니?

    def bitsoncount(x):
        b   = 0
        bit = 1
        while bit <= x:
            b += int(x & bit > 0)
            bit = bit << 1
    
        return b
    

    기본적으로, 오른쪽에서 시작하여 in 매개 변수의 비트 길이까지 끝까지 이동 한 테스트 비트를 사용합니다. 각 위치에 대해 비트 & x는 켜져 있거나없는 단일 비트를 생성합니다. 0>을 확인하고 결과 True | False를 int ()로 1 | 0로 바꾼 다음 이것을 누산기에 추가합니다. 오랫동안 잘 작동하는 것 같습니다 :-).

  8. from https://stackoverflow.com/questions/407587/python-set-bits-count-popcount by cc-by-sa and MIT license