1byte 데이터에 포함된 임의의 비트 위치의 값을 얻는 방법
하고 싶은 일
나는 1byte 데이터에서 임의의 비트 위치의 값을 얻는 방법을 고려했기 때문에 문장에 남기고 싶다.
예를 들어 1byte의 데이터
0b10100000
를 얻었을 때(이하 그림) 4비트에서 2비트의 값0b10
까지의 방법.이번에 생각한 방법은 다음과 같은 두 가지다.
문자열로 변환
대상 비트 값을 문자열로 변환하고 비트 위치 = 문자열 위치로 대상 비트 값을 추출합니다.
이 방법의 주의점은 문자열의 위치와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')
끝맺다
더 쉽고 스마트하게 계산할 수 있다고 생각했지만 더 많은 방안이 떠오르지 않았다.
다만, 목적치는 이렇게 하면 얻을 수 있다.
비트 조작을 더욱 잘 사용할 수 있도록 저는 매일 노력하고 있습니다.
Reference
이 문제에 관하여(1byte 데이터에 포함된 임의의 비트 위치의 값을 얻는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/ushinji/articles/27028560f2a511텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)