如何在JavaScript中将十进制值转换为十六进制值?
当前回答
没有循环:
function decimalToHex(d) {
var hex = Number(d).toString(16);
hex = "000000".substr(0, 6 - hex.length) + hex;
return hex;
}
// Or "#000000".substr(0, 7 - hex.length) + hex;
// Or whatever
// *Thanks to MSDN
另外,不使用必须评估的循环测试不是更好吗?
例如,代替:
for (var i = 0; i < hex.length; i++){}
have
for (var i = 0, var j = hex.length; i < j; i++){}
其他回答
您可以在ECMAScript 6中执行以下操作:
const toHex = num => (num).toString(16).toUpperCase();
function dec2hex(i)
{
var result = "0000";
if (i >= 0 && i <= 15) { result = "000" + i.toString(16); }
else if (i >= 16 && i <= 255) { result = "00" + i.toString(16); }
else if (i >= 256 && i <= 4095) { result = "0" + i.toString(16); }
else if (i >= 4096 && i <= 65535) { result = i.toString(16); }
return result
}
我正在一个相当大的循环中转换为十六进制字符串,所以我尝试了几种技术以找到最快的方法。我的要求是得到一个固定长度的字符串,并正确编码负值(-1=>ff..f)。
Simple.toString(16)不适合我,因为我需要正确编码负值。以下代码是迄今为止我在1-2字节值上测试的最快的代码(请注意,符号定义了要获得的输出符号的数量,即对于4字节整数,它应该等于8):
var hex = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
function getHexRepresentation(num, symbols) {
var result = '';
while (symbols--) {
result = hex[num & 0xF] + result;
num >>= 4;
}
return result;
}
它在1-2字节的数字上比.toString(16)执行得更快,在更大的数字上(当符号>=6时)执行得更慢,但仍应优于正确编码负值的方法。
正如公认的答案所述,从十进制转换为十六进制的最简单方法是var hex=dec.toString(16)。但是,您可能更喜欢添加字符串转换,因为它可以确保像“12”.toString(16)这样的字符串表示正确工作。
// Avoids a hard-to-track-down bug by returning `c` instead of `12`
(+"12").toString(16);
为了扭转这个过程,您也可以使用下面的解决方案,因为它更短。
var dec = +("0x" + hex);
在Google Chrome和Firefox中,速度似乎较慢,但在Opera中则明显更快。看见http://jsperf.com/hex-to-dec.
为了完整起见,如果您想要负数的二进制补码十六进制表示,可以使用零填充右移>>运算符。例如:
> (-1).toString(16)
"-1"
> ((-2)>>>0).toString(16)
"fffffffe"
然而,有一个限制:JavaScript按位运算符将其操作数视为32位的序列,也就是说,您将得到32位2的补码。