[ビット演算-単純] 405。数値は16進数に変換されます

[タイトル]
整数を指定して、この数値を16進数に変換するアルゴリズムを記述します。負の整数の場合、通常は1の補数演算を使用します。
[注]
16進法のすべての文字(af)は小文字でなければなりません。
16進文字列に余分な先行ゼロを含めることはできません。変換される数値が0の場合、単一の文字「0」で表されます。それ以外の場合、16進文字列の最初の文字は0文字ではありません。
指定された数値は、32ビットの符号付き整数の範囲内にあることが保証されています。
ライブラリが提供するメソッドを使用して、数値を16進数に直接変換またはフォーマットすることはできません。
[例1]
入力:
26
出力:
"1a"
[例2]
入力:
-1
出力:
"ffffffff"
[知識ポイント]ステップ
1:まず、補数が何であるかを知る必要があり
ます正の数は元のコードです。逆数コード、および補数これらはすべてそれ自体
です。元のコード、1の補数、および負の数の補数は特別です。次の分析を参照してください。
例として32ビットの数を取り上げます。-
1

原码:1000 0000 0000 0000 0000 0000 0000 0001
反码:1111 1111 1111 1111 1111 1111 1111 1110
补码:1111 1111 1111 1111 1111 1111 1111 1111

左側の最初のものは符号ビット、1は負の数を表し、負の数の逆コードは、符号ビットを除いて数0を1に、1を0に変更する反転状態です。負の数の補数は、1の補数+1
[負の数]補数+ 1 = [負の数]の補数
step2:したがって、入力される可能性のある負の数numを処理してから、16進数に変換する必要があります。
まず、負の数-> 2進法->補数コード->補数コード-> 16進法、コードの次の部分は、負の数numを2進法に変換し、次に補数コード]、次にコードを補うことです。 10進数に変換するプロセス。ここでは、逆コードから16進数に直接変換したのではなく、10進数に変換してから、16進数に変換したことに注意してください。コードを再利用するために、次の数値は、数値が正の場合のコードです。 。

if num<0:
	temp=bin(num)[3:]
	s=list("{0:1>32}".format(temp))
	i=31
	for i in range(31,31-len(temp),-1):
	    s[i]='0' if s[i]=='1' else '1'
	num=int("".join(s),2)+1

[コード]
[Python]
ここに画像の説明を挿入

class Solution:
    def toHex(self, num: int) -> str:
        oct_hex={
    
    0:"0",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",10:"a",11:"b",12:"c",13:"d",14:"e",15:"f"}
        ans=""
        if num<0:
            temp=bin(num)[3:]
            s=list("{0:1>32}".format(temp))
            i=31
            for i in range(31,31-len(temp),-1):
                if s[i]=='1':
                    s[i]='0'
                else:
                    s[i]='1'
            num=int("".join(s),2)+1
        if num>0:
            while num:
                ans=oct_hex[num%16]+ans
                num//=16
        else:
            return "0"
        return ans

【簡潔版】

class Solution:
    def toHex(self, num: int) -> str:
        oct_hex="0123456789abcdef"
        ans=""
        if num<0:
            temp=bin(num)[3:]
            s=list("{0:1>32}".format(temp))
            i=31
            for i in range(31,31-len(temp),-1):
                s[i]='0' if s[i]=='1' else '1'
            num=int("".join(s),2)+1
        if num>0:
            while num:
                ans=oct_hex[num%16]+ans
                num//=16
        else:
            return "0"
        return ans

【方法3】

class Solution:
    def toHex(self, num: int) -> str:
        if num == 0:
            return "0"
        oct_hex = "0123456789abcdef"
        ans = ""
        while num and len(ans) < 8:
            ans = oct_hex[num & 0xf] + ans
            num >>=  4
        return ans

おすすめ

転載: blog.csdn.net/kz_java/article/details/115120649