복붙노트

[PYTHON] 파이썬에서 long의 부호있는 정수 값을 얻는 방법?

PYTHON

파이썬에서 long의 부호있는 정수 값을 얻는 방법?

lv가 long 값을 저장하고 기계가 32 비트이면 다음 코드가 사용됩니다.

iv = int(lv & 0xffffffff)

결과는 기계의 int 대신 long 유형의 iv입니다.

이 경우 (서명 된) int 값을 어떻게 얻을 수 있습니까?

해결법

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

    1.

    import ctypes
    
    number = lv & 0xFFFFFFFF
    
    signed_number = ctypes.c_long(number).value
    
  2. ==============================

    2.당신은 높은 수준의 스크립팅 언어로 작업하고 있습니다. 기본적으로 실행중인 시스템의 원시 데이터 유형은 표시되지 않습니다. 다음과 같은 코드로 네이티브 서명 된 int로 캐스트 할 수 없습니다.

    당신은 높은 수준의 스크립팅 언어로 작업하고 있습니다. 기본적으로 실행중인 시스템의 원시 데이터 유형은 표시되지 않습니다. 다음과 같은 코드로 네이티브 서명 된 int로 캐스트 할 수 없습니다.

    플랫폼에 관계없이 값을 32 비트 부호있는 정수로 변환하려는 경우 간단한 계산으로 변환하면됩니다.

    iv = 0xDEADBEEF
    if(iv & 0x80000000):
        iv = -0x100000000 + iv
    
  3. ==============================

    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. ==============================

    4.당신은 struct library를 사용하여 이와 같은 값을 변환 할 수 있습니다. 추악하지만 작동합니다.

    당신은 struct library를 사용하여 이와 같은 값을 변환 할 수 있습니다. 추악하지만 작동합니다.

    from struct import pack, unpack
    signed = unpack('l', pack('L', lv & 0xffffffff))[0]
    
  5. ==============================

    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. ==============================

    6.빠르고 더러운 솔루션 (x는 필자의 경우 32 비트 이상입니다.)

    빠르고 더러운 솔루션 (x는 필자의 경우 32 비트 이상입니다.)

    if x > 0x7fffffff:
        x = x - 4294967296
    
  7. 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