leetcode-456-Convert a Number to Hexadecimal
来源:互联网 发布:ubuntu开机启动程序 编辑:程序博客网 时间:2024/06/11 13:31
问题
题目:[leetcode-456]
思路
这个题主要涉及的是计算机中信息表示的方法。对于一个数字,在计算机中怎么表示的方法。对于有符号数,一般用(two’s complement)实现。当然,我们在解决这个题目的时候,并不按照之之前最基本的那一套去求解。而是充分考虑信息在计算机中的表示。我们知道有一个结论是:对于用补码表示的任何一个数,一定存在一个无符号数与它的表示一致。当然,这也很容易理解,对于同等位数的位向量来说。有符号数可以表示的范围是无符号数的一半,当然,他们所编码的个数是一样的。所以,他们的区别仅仅在于计算机怎么解释信息的表示。这一部分可以参考深入理解计算机系统第二章的内容。
代码
class Solution {public: string toHex(int num) { if(!num) return "0"; std::string ret; unsigned uval = (unsigned)num; // 转换成其对应的无符号数 while(uval) { unsigned t = uval%16; uval /= 16; char ch = (t < 10)?('0' + t):('a' + t-10); std::string s(1, ch); ret = s + ret; } return ret; }};
当然,上面的办法有点“耍赖”,因为并没有直接解决问题。而是借助了强转。那么我们直接进行求解。
考虑有符号数(two’s complement)位向量到有符号数的映射:
在这个形式中,将字第最高有效位解释为负权(negative weight)。所以,按照之前的办法进行“除R取余”的时候,需要去除最高负权位的影响,即先加上最高有效位对应的正权。然后再进行“除R取余”即先处理成如下的等式左面,然后“除R取余”。
这么做的大致思路没有问题,但是在对于除了2进制以外的进制时,需要对最高位做修正。
问题1(-1转换为2进制表示)
std::string T2B2( int val ){ if(!val) // 0的情形 return "0"; unsigned w = 0x80000000;// 最高位负权 std::string ret; if(val < 0) { val += w; ret = "1" + ret; } if(!val) // -2147483648的情形 return "10000000000000000000000000000000"; while( val ) { int t = val%2; val /= 2; std::string s(1,'0'+t); ret = s + ret; } return ret;}
至于原因,我觉得二进制的表示和计算机内部一样,所以恰好差一位,之前补上符号位就行。但是其他进制,差的不只是一位,所以最高位的缺陷,没法通过位数直接体现出来,所以需要修正。
问题2(-1转换为16进制表示)
std::string T2B1( int num ){ if(!num) // 0的情形 return "0"; unsigned w = 0x80000000; // 最高位负权 std::string ret; int val = num; if(val < 0) // 修正负数的情形 { val += w; } if(!val) //-2147483648的情形 return "80000000"; while( val ) { int t = val%16; val /= 16; char ch = (t<10)?('0'+t):('a' + t - 10); std::string s(1,ch); ret = s + ret; }; if(num<0) // 对于负数的最高位进行修正 { if( '0' <= ret[0] && ret[0] < '8' ) // 证明最高位不是1 { int t = ret[0] - '0' + 8; // 修正最高位 if( t > 10 ) ret[0] = 'a' + t-10; else ret[0] = '0' + t; } } return ret;}
根据上面的讨论,可以得到该问题的另一种代码
代码1
class Solution {public: string toHex(int num) { if(!num) return "0"; unsigned w = 0x80000000; // 最高位负权 std::string ret; int val = num; if(val < 0) // 修正负数的情形 { val += w; } if(!val) return "80000000"; while( val ) { int t = val%16; val /= 16; char ch = (t<10)?('0'+t):('a' + t - 10); std::string s(1,ch); ret = s + ret; }; if(num<0) // 对于负数的最高位进行修正 { if( '0' <= ret[0] && ret[0] < '8' ) // 证明最高位不是1 { int t = ret[0] - '0' + 8; // 修正最高位 if( t > 10 ) ret[0] = 'a' + t-10; else ret[0] = '0' + t; } } return ret; }};
0 0
- leetcode-456-Convert a Number to Hexadecimal
- [Leetcode] Convert a Number to Hexadecimal
- [LeetCode]Convert a Number to Hexadecimal(Java)
- LeetCode 405 Convert a Number to Hexadecimal
- LeetCode[405] Convert a Number to Hexadecimal
- LeetCode #405: Convert a Number to Hexadecimal
- LeetCode 405. Convert a Number to Hexadecimal
- [LeetCode]--405. Convert a Number to Hexadecimal
- [leetcode]405. Convert a Number to Hexadecimal
- Leetcode 405 Convert a Number to Hexadecimal
- LeetCode 405. Convert a Number to Hexadecimal
- leetcode 405. Convert a Number to Hexadecimal
- leetcode 405. Convert a Number to Hexadecimal
- LeetCode 405. Convert a Number to Hexadecimal
- LeetCode 405. Convert a Number to Hexadecimal
- 【LeetCode】 405. Convert a Number to Hexadecimal
- LeetCode -- Convert a Number to Hexadecimal
- Leetcode Convert a Number to Hexadecimal 405
- 使用Altium Designer进行DDR2的PCB设计
- 几种负载均衡技术的实现
- rpmbuild之spec文件说明
- 大龄程序员的发展方向
- Spring声明式事务的配置方式
- leetcode-456-Convert a Number to Hexadecimal
- MySQL Server架构图
- 用eclipse创建动态web项目手动生成web.xml方法
- VB Format函数
- ThreadLocal内存泄露(下)
- exec函数族的作用与讲解
- 【android学习】SharedPreferences详解
- 带你玩转javaWeb之七-使用JDBC完成CRUD的操作
- ROS 模拟激光仿真数据 使用stage进行仿真 在stage中控制两个机器人