문제

부울 배열의 소형 표현이 필요합니다. Python은 내장 비트 필드 유형을 가지고 있습니까? 아니면 대체 솔루션을 찾아야합니까?

도움이 되었습니까?

해결책

Bitarray 내가 최근에 비슷한 필요를 가졌을 때 내가 찾은 최고의 대답이었습니다. 그것은 C 확장자 (Bitvector보다 훨씬 빠르고, 순수한 파이썬) 데이터를 실제 비트 필드에 저장합니다 (따라서 요소 당 바이트를 사용하는 것으로 보이는 Numpy 부울 어레이보다 메모리가 8 배 더 높습니다.)

다른 팁

주로 비트 필드의 이름을 지정하고 쉽게 조작하려면 통신 프로토콜에서 단일 비트로 표시되는 플래그로 작업하려면 표준 구조 및 Union 기능을 사용할 수 있습니다. ctypes, 설명대로 Python에서 CType Structure + Union을 올바르게 선언하는 방법은 무엇입니까? - 스택 오버플로

예를 들어, 4 바이트의 4 가지 비트 비트를 개별적으로 작업하려면 작은 엔진 구조에서 최소한에서 가장 중요한 이름으로 이름을 지정하십시오. 조합을 사용하여 바이트 또는 INT와 동일한 데이터에 대한 액세스를 제공하여 데이터를 통신 프로토콜 안팎으로 이동할 수 있습니다. 이 경우에는이 경우에 수행됩니다 flags.asbyte 필드:

import ctypes
c_uint8 = ctypes.c_uint8

class Flags_bits(ctypes.LittleEndianStructure):
    _fields_ = [
            ("logout", c_uint8, 1),
            ("userswitch", c_uint8, 1),
            ("suspend", c_uint8, 1),
            ("idle", c_uint8, 1),
        ]

class Flags(ctypes.Union):
    _fields_ = [("b", Flags_bits),
                ("asbyte", c_uint8)]

flags = Flags()
flags.asbyte = 0xc

print(flags.b.idle)
print(flags.b.suspend)
print(flags.b.userswitch)
print(flags.b.logout)

4 개의 비트 (여기에서 가장 중요한 것으로부터 인쇄했는데, 인쇄 할 때 더 자연스럽게 보이는)는 이진에서 1, 1, 0, 0, 즉 0xc입니다.

당신은 비트 스트링 최근 버전 2.0에 도달 한 모듈. 이진 데이터는 바이트 어레이로 소형 저장되며 쉽게 생성, 수정 및 분석 할 수 있습니다.

당신은 만들 수 있습니다 BitString 바이너리, 옥탈, 16 진수, 정수 (큰 또는 작은 엔디 언), 문자열, 바이트, 부유물, 파일 등의 물체.

a = BitString('0xed44')
b = BitString('0b11010010')
c = BitString(int=100, length=14)
d = BitString('uintle:16=55, 0b110, 0o34')
e = BitString(bytes='hello')
f = pack('<2H, bin:3', 5, 17, '001') 

그런 다음 간단한 기능 또는 슬라이스 표기법으로 분석하고 수정할 수 있습니다. 비트 마스크 등에 대해 걱정할 필요가 없습니다.

a.prepend('0b110')
if '0b11' in b:
    c.reverse()
g = a.join([b, d, e])
g.replace('0b101', '0x3400ee1')
if g[14]:
    del g[14:17]
else:
    g[55:58] = 'uint:11=33, int:9=-1'

비트 위치의 개념도 있으므로 파일이나 스트림처럼 취급 할 수 있습니다. 속성은 비트 데이터에 대한 다른 해석을 제공하는 데 사용됩니다.

w = g.read(10).uint
x, y, z = g.readlist('int:4, int:4, hex:32')
if g.peek(8) == '0x00':
    g.pos += 10

또한 표준 비트 와이드 바이너리 연산자, 포장, 포장 풀기, 엔디 니스 등을 지원합니다. 최신 버전은 Python 2.7 및 3.X 용이며, 순수한 파이썬이지만 메모리와 속도 측면에서 합리적으로 잘 최적화됩니다.

이진 비트 측면 연산자!, &, |, ^, >> 및 <<. 그것들은 실제로 잘 작동하며 기본 C에서 직접 구현되며, 일반적으로 기본 하드웨어에 직접적으로 이루어집니다.

각 값을 두 가지의 힘으로 표시하십시오.

testA = 2**0
testB = 2**1
testC = 2**3

그런 다음 값을 설정하려면 :

table = table | testB

허위를 설정하려면 :

table = table & (~testC)

값을 테스트하려면 :

bitfield_length = 0xff
if ((table & testB & bitfield_length) != 0):
    print "Field B set"

이것이 당신에게 의미가 없다면 16 진수 표현에 대해 조금 더 깊이 파고 들으십시오. 이것은 기본적으로 임베디드 C 응용 프로그램에서 부울 플래그를 추적하는 방법입니다 (메모리를 제한 한 경우).

비트 벡터 패키지는 필요한 것일 수 있습니다. 파이썬 설치에 내장되어 있지 않지만 파이썬 사이트에서 쉽게 추적 할 수 있습니다.

https://pypi.python.org/pypi/bitvector 현재 버전의 경우.

Numpy는 a 배열 인터페이스 비트 필드를 만드는 데 사용할 수있는 모듈.

비트 필드가 짧으면 아마도 사용할 수 있습니다. 구조물 모듈. 그렇지 않으면 나는 일종의 래퍼를 추천합니다 배열 모듈.

또한 CTYPES 모듈에는 포함되어 있습니다 비트 필드, 그러나 나는 그것을 직접 사용한 적이 없다. 경고 emptor.

ints (또는 Long Ints)를 사용하여 BOOL의 배열 (또는 정수 세트)으로 표시하려면 살펴보십시오. http://sourceforge.net/projects/pybitop/files/

비트 필드의 삽입/추출물을 긴 INT로 제공합니다. 가장 중요하거나 가장 중요하지 않은 '1'비트를 찾는 것; 모든 1을 계산; 비트 반전; 순수한 파이썬에서는 모두 가능하지만 C에서는 훨씬 빠릅니다.

대부분 이루어지는 비트가 있습니다 https://pypi.org/project/range_set/ Python의 내장과 호환되는 API 모듈 set. 이름에서 알 수 있듯이 비트를 시작/종료 쌍으로 저장합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top