给定十进制格式的数字N,任务是将其转换为N作为字符串的十六进制表示形式。负数以2的补码形式存储。
例子:
Input: N = 134
Output: 88
Explanation:
134 = 00000000000000000000000010001000 in 32 bit representation. Grouping in four-size chunks and converting each chunk to equivalent hexadecimal yields 88. Also, we can see 8*16 + 8 = 134. We will also get the same result by remainder technique discussed in other post.
Input: N = -1
Output: ffffffff
方法:
想法是以更大的大小存储负数,以欺骗编译器将其读取为正数而不是负数,然后使用常规的余数技术。将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