1byte 데이터에 포함된 임의의 비트 위치의 값을 얻는 방법

4099 단어 Pythontech

하고 싶은 일


나는 1byte 데이터에서 임의의 비트 위치의 값을 얻는 방법을 고려했기 때문에 문장에 남기고 싶다.
예를 들어 1byte의 데이터0b10100000를 얻었을 때(이하 그림) 4비트에서 2비트의 값0b10까지의 방법.

이번에 생각한 방법은 다음과 같은 두 가지다.
  • 문자열로 변환
  • bit 연산 이용
  • 소스 코드는python입니다.

    문자열로 변환


    대상 비트 값을 문자열로 변환하고 비트 위치 = 문자열 위치로 대상 비트 값을 추출합니다.
    이 방법의 주의점은 문자열의 위치와bit의 위치가 상반되는 것이다.다음 예에서 문자열이 반전[::-1]된 후에 목표 값을 추출하고 추출한 후에 반전하여 정확한 비트 값으로 전환한다.
    bit_pos = 4
    bit_len = 2
    value = 0xA0 # 0b10100000
    
    # bit値として文字列に変換
    bit_str = "{:08b}".format(value)
    # bit_str = '10100000'
    
    # 文字列を反転し、bit位置(`bit_pos`)とbit長(`bit_len`)で目的の値を抽出。抽出値はbit値としては反転しているので、再反転して値を戻す
    value = bit_str[::-1][bit_pos:bit_pos+bit_len][::-1]
    result = int(value, 2)
    # result: 2 (='0b10')
    
    bit_pos,bit_len 문자열의 위치를 잘 변환할 수 있다면 문자열의 반전 없이 목표 값을 추출할 수 있다.

    비트 연산 사용


    다음은 비트 연산을 사용하는 방법입니다.구체적으로 말하면bit의 위치 이동 연산과 논리적 적을 이용한다.
    우선, 대상 데이터를 얻으려는bit 위치를 0bit로 오른쪽으로 이동합니다.
    이에 비해 00000011의 값과 논리적 적을 계산하면 목표의bit값을 얻을 수 있다.
    따라서 11111111=0xFF를 오른쪽으로 옮겨 논리적 대상 데이터00000011를 만든다.
    이상의 처리는 그림으로 총결하면 다음과 같다.

    실제 코드는 다음과 같습니다.
    bit_pos = 4
    bit_len = 2
    value = 0xA0 # 0b10100000
    result = (value >> bit_pos) & (0xFF >> (8 - bit_len))
    # result: 2 (='0b10')
    

    끝맺다


    더 쉽고 스마트하게 계산할 수 있다고 생각했지만 더 많은 방안이 떠오르지 않았다.
    다만, 목적치는 이렇게 하면 얻을 수 있다.
    비트 조작을 더욱 잘 사용할 수 있도록 저는 매일 노력하고 있습니다.

    좋은 웹페이지 즐겨찾기