📜  将十进制转换为十六进制十进制,包括负数

📅  最后修改于: 2021-05-25 09:14:18             🧑  作者: Mango

给定十进制格式的数字N,任务是将其转换为N作为字符串的十六进制表示形式。负数以2的补码形式存储。

例子:

方法:
想法是以更大的大小存储负数,以欺骗编译器将其读取为正数而不是负数,然后使用常规的余数技术。将num存储在u_int中,u_it的大小较大,由于MSB为0,因此它将为正数。

下面是上述方法的实现:

C++
// C++ program to convert decimal
// to hexadecimal covering negative numbers
  
#include 
using namespace std;
  
// Function to convert decimal no.
// to hexadecimal number
string Hex(int num)
{
    // map for decimal to hexa, 0-9 are
    // straightforward, alphabets a-f used
    // for 10 to 15.
    map m;
  
    char digit = '0';
    char c = 'a';
  
    for (int i = 0; i <= 15; i++) {
        if (i < 10) {
            m[i] = digit++;
        }
        else {
            m[i] = c++;
        }
    }
  
    // string to be returned
    string res = "";
  
    // check if num is 0 and directly return "0"
    if (!num) {
        return "0";
    }
    // if num>0, use normal technique as
    // discussed in other post
    if (num > 0) {
        while (num) {
            res = m[num % 16] + res;
            num /= 16;
        }
    }
    // if num<0, we need to use the elaborated
    // trick above, lets see this
    else {
        // store num in a u_int, size of u_it is greater,
        // it will be positive since msb is 0
        u_int n = num;
  
        // use the same remainder technique.
        while (n) {
            res = m[n % 16] + res;
            n /= 16;
        }
    }
  
    return res;
}
  
// Driver Code
int main()
{
    int x = 134, y = -1, z = -234;
  
    cout << "Hexa representation for" << endl;
    cout << x << " is " << Hex(x) << endl;
    cout << y << " is " << Hex(y) << endl;
    cout << z << " is " << Hex(z) << endl;
  
    return 0;
}


Java
// Java program to convert decimal
// to hexadecimal covering negative numbers
import java.util.*; 
import java.util.HashMap; 
import java.util.Map; 
  
class GFG
{
  
// Function to convert decimal no.
// to hexadecimal number
static String Hex(int num)
{
    // map for decimal to hexa, 0-9 are
    // straightforward, alphabets a-f used
    // for 10 to 15.
      
    HashMap m = new HashMap();
  
    char digit = '0';
    char c = 'a';
  
    for (int i = 0; i <= 15; i++) {
        if (i < 10) {
            m.put(i, digit);
            digit++;
        }
        else {
            m.put(i, c);
            c++;
        }
    }
  
    // string to be returned
    String res = "";
  
    // check if num is 0 and directly return "0"
    if (num == 0) {
        return "0";
    }
    // if num>0, use normal technique as
    // discussed in other post
    if (num > 0) {
        while (num != 0) {
            res = m.get(num % 16) + res;
            num /= 16;
        }
    }
    // if num<0, we need to use the elaborated
    // trick above, lets see this
    else {
        // store num in a u_int, size of u_it is greater,
        // it will be positive since msb is 0
        int n = num;
  
        // use the same remainder technique.
        while (n != 0) {
            res = m.get(n % 16) + res;
            n /= 16;
        }
    }
  
    return res;
}
  
// Driver Code
public static void main(String []args)
{
    int x = 134, y = -1, z = -234;
  
    System.out.println("Hexa representation for" );
    System.out.println(x +" is " + Hex(x));
    System.out.println( y +" is " + Hex(y));
    System.out.println( z + " is " + Hex(z));    
}
}
  
// This code is contributed by chitranayal


Python3
# Python3 program to convert decimal 
# to hexadecimal covering negative numbers 
  
# Function to convert decimal no. 
# to hexadecimal number 
def Hex(num) : 
  
    # map for decimal to hexa, 0-9 are 
    # straightforward, alphabets a-f used 
    # for 10 to 15. 
    m = dict.fromkeys(range(16), 0); 
  
    digit = ord('0'); 
    c = ord('a'); 
  
    for i in range(16) :
        if (i < 10) :
            m[i] = chr(digit);
            digit += 1;
          
        else :
            m[i] = chr(c);
            c += 1
  
    # string to be returned 
    res = ""; 
  
    # check if num is 0 and directly return "0" 
    if (not num) :
        return "0"; 
  
    # if num>0, use normal technique as 
    # discussed in other post 
    if (num > 0) :
        while (num) :
            res = m[num % 16] + res; 
            num //= 16; 
      
    # if num<0, we need to use the elaborated 
    # trick above, lets see this 
    else :
          
        # store num in a u_int, size of u_it is greater, 
        # it will be positive since msb is 0 
        n = num + 2**32; 
  
        # use the same remainder technique. 
        while (n) :
            res = m[n % 16] + res; 
            n //= 16; 
  
    return res; 
  
# Driver Code 
if __name__ == "__main__" : 
  
    x = 134; y = -1; z = -234; 
  
    print("Hexa representation for"); 
    print(x, "is", Hex(x)); 
    print(y, "is", Hex(y)); 
    print(z, "is", Hex(z)); 
  
# This code is contributed by AnkitRai01


输出:
Hexa representation for
134 is 86
-1 is ffffffff
-234 is ffffff16