如何计算表示任何负值所需的位数?

时间:2014-08-13 13:21:04

标签: javascript c++ binary decimal signed

我想知道是否有计算允许我获得存储任何负(带符号)值(例如-1,-255,-1324等)所需的位数? / p>

目前我已经实现了一个函数来计算大于等于0的值:

calculateBitsNeeded = function (value) {

    if (value == 0) {

        return 1;
    }
    else if (value > 0) {

        return Math.floor(Math.log(value) / Math.LN2) + 1;
    }
    else {

        //TODO ...
    }
};

例如:如果我有数字-38,我需要7位存储(101 1010)。

感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

假设您正在谈论整数数字

要回答您的问题,您必须了解在所有现代平台上,整数被视为已签名未签名

JavaScript实际上不支持整数,它们存储为浮点值。但是,64位浮点数可以完全准确地处理53位整数,因此它可以轻松处理C使用的16位整数。

我会忽略这些并将我的答案限制为您用来与C交谈的16位整数。

16位无符号位整数的值可以为:0 - 65535

签名整数的值可以为:−32,768 to 32,767

在两种编码下,数字0 - 32,767以相同的方式存储。处理没有区别。

但是,使用名为two's compliment的系统存储数字32,768 - 0

按比例,数字-132,768是相同的。 -232,767是相同的。

因此,计算负整数所需位的最简单方法是将其转换为带符号的等效值。