[PYTHON] 파이썬에서 long의 부호있는 정수 값을 얻는 방법?
PYTHON파이썬에서 long의 부호있는 정수 값을 얻는 방법?
lv가 long 값을 저장하고 기계가 32 비트이면 다음 코드가 사용됩니다.
iv = int(lv & 0xffffffff)
결과는 기계의 int 대신 long 유형의 iv입니다.
이 경우 (서명 된) int 값을 어떻게 얻을 수 있습니까?
해결법
-
==============================
1.
import ctypes number = lv & 0xFFFFFFFF signed_number = ctypes.c_long(number).value
-
==============================
2.당신은 높은 수준의 스크립팅 언어로 작업하고 있습니다. 기본적으로 실행중인 시스템의 원시 데이터 유형은 표시되지 않습니다. 다음과 같은 코드로 네이티브 서명 된 int로 캐스트 할 수 없습니다.
당신은 높은 수준의 스크립팅 언어로 작업하고 있습니다. 기본적으로 실행중인 시스템의 원시 데이터 유형은 표시되지 않습니다. 다음과 같은 코드로 네이티브 서명 된 int로 캐스트 할 수 없습니다.
플랫폼에 관계없이 값을 32 비트 부호있는 정수로 변환하려는 경우 간단한 계산으로 변환하면됩니다.
iv = 0xDEADBEEF if(iv & 0x80000000): iv = -0x100000000 + iv
-
==============================
3.내가 이것을 제안해도 될까?
내가 이것을 제안해도 될까?
def getSignedNumber(number, bitLength): mask = (2 ** bitLength) - 1 if number & (1 << (bitLength - 1)): return number | ~mask else: return number & mask print iv, '->', getSignedNumber(iv, 32)
-
==============================
4.당신은 struct library를 사용하여 이와 같은 값을 변환 할 수 있습니다. 추악하지만 작동합니다.
당신은 struct library를 사용하여 이와 같은 값을 변환 할 수 있습니다. 추악하지만 작동합니다.
from struct import pack, unpack signed = unpack('l', pack('L', lv & 0xffffffff))[0]
-
==============================
5.근본적으로 문제는 32 비트에서 부호를 무한 수의 비트로 확장하는 것입니다. 파이썬에는 임의의 큰 정수가 있기 때문입니다. 일반적으로, 기호 확장은 캐스팅시 CPU 명령어에 의해 자동으로 수행되므로, 파이썬에서 C가 말하는 것보다 더 어렵다는 것이 흥미 롭습니다.
근본적으로 문제는 32 비트에서 부호를 무한 수의 비트로 확장하는 것입니다. 파이썬에는 임의의 큰 정수가 있기 때문입니다. 일반적으로, 기호 확장은 캐스팅시 CPU 명령어에 의해 자동으로 수행되므로, 파이썬에서 C가 말하는 것보다 더 어렵다는 것이 흥미 롭습니다.
놀아서, BreizhGatch의 기능과 비슷한 것을 발견했지만 조건문은 필요하지 않습니다. n & 0x80000000은 32 비트 부호 비트를 추출합니다. 그런 다음 - 동일한 32 비트 표현을 유지하지만 부호 확장을 수행합니다. 마지막으로 확장 된 부호 비트가 n에 설정됩니다.
def toSigned32(n): n = n & 0xffffffff return n | (-(n & 0x80000000))
Bit Twiddling Hacks는 아마도 더 일반적으로 작동하는 다른 해결책을 제안합니다. n ^ 0x80000000은 32 비트 부호 비트를 뒤집습니다. - 0x80000000은 반대 비트를 부호 확장합니다. 그것에 대해 생각해 볼 수있는 또 다른 방법은 처음에는 음수가 양수보다 큽니다 (0x80000000로 분리됨). ^ 그들의 위치를 바꾼다; 음수를 0 이하로 이동시킵니다.
def toSigned32(n): n = n & 0xffffffff return (n ^ 0x80000000) - 0x80000000
-
==============================
6.빠르고 더러운 솔루션 (x는 필자의 경우 32 비트 이상입니다.)
빠르고 더러운 솔루션 (x는 필자의 경우 32 비트 이상입니다.)
if x > 0x7fffffff: x = x - 4294967296
from https://stackoverflow.com/questions/1375897/how-to-get-the-signed-integer-value-of-a-long-in-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬을 사용하여 JSON을 파싱하는 동안 'module'객체에 'loads'속성이 없습니다. (0) | 2018.11.13 |
---|---|
[PYTHON] Sphinx 문서의 조건부 출력 (0) | 2018.11.13 |
[PYTHON] 파이썬은 목록 (배열)의 최소 최대 값과 평균을 찾습니다. (0) | 2018.11.13 |
[PYTHON] 어떤 Python이 일부 Numpy 임포트에서 해결되지 않은 참조 오류를주는 이유는 무엇입니까? (0) | 2018.11.13 |
[PYTHON] Flask-SQLAlchemy 테이블에 행이 있는지 확인 (0) | 2018.11.13 |