更快/更简洁的方法来计算存储有符号/无符号整数所需的适当大小?
是否有更快的方法(可能是位操作?)来查找给定值的整数所需的大小? 这是我所得到的:
uint_length(Value) ->
if Value < 256 -> 1;
Value < 65535 -> 2;
Value < 4294967295 -> 4
end.
sint_length(Value) ->
if Value < 128 andalso Value >= 0 -> 1;
Value < 32767 andalso Value >= 0 -> 2;
Value < 2147483647 andalso Value >= 0 -> 4;
Value > -128 -> 1;
Value > -32767 -> 2;
Value > -2147483647 -> 4
end.
Is there a faster way (possibly bit manipulation?) to find the size needed for an integer of a given value? Here's what I've got:
uint_length(Value) ->
if Value < 256 -> 1;
Value < 65535 -> 2;
Value < 4294967295 -> 4
end.
sint_length(Value) ->
if Value < 128 andalso Value >= 0 -> 1;
Value < 32767 andalso Value >= 0 -> 2;
Value < 2147483647 andalso Value >= 0 -> 4;
Value > -128 -> 1;
Value > -32767 -> 2;
Value > -2147483647 -> 4
end.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
如前所述,表示以 2 为底的数字所需的位数可以使用对数来计算。 比如Erlang中的如下代码。
如果您只关心字长 1,2 和 4,那么最好只检查少数限制。 我喜欢使用 Erlang 的基数表示法以 16 为基数作为限制。
我从你的代码中假设你正在使用二进制补码作为有符号整数。 因此,我将负数映射到正数,这样我就可以使用同一张表。
As mentioned, the number of bits needed to represent a number in base two can be calculated using logarithms. Such as the following code in Erlang.
If you are only concerned with word sizes 1,2 and 4, then it is of course nice to check only the few limits. I like to use base 16 for the limits using Erlang's radix notation.
And I assume from your code that you are using two's complement for signed integers. So I map negative numbers over to positive so I can use the same table.
取以 2 为底的对数,除以 8,然后向上舍入到最接近的无符号整数整数。 对于有符号,除了除以 8 之前的 + 1 之外相同。
如果您没有允许您指定底数的对数函数,您可以简单地通过以下方式转换底数:
示例计算:
这适用于任意大的数字。 如果您将自己限制为仅可能 1,2 或 4 字节结果,那么仅使用您拥有的切换逻辑可能是最快的方法。
Take the logarithm, base 2, divide it by 8, and round it up to the nearest whole number for unsigned ints. For signed, the same except + 1 before the division by 8.
If you don't have a logarithm function that allows you to specify the base, you can simply convert base via this instead:
Example calculation:
This is for arbitrarily large numbers. If you're limiting yourself to only potentially 1,2, or 4 byte results, then just using the switching logic you have is probably the fastest method.
对于您的 uint,它应该是
"<= 65535"
或"<65536"
。 232 也是如此,但第一个 (256) 还可以。我会选择:
这假设您将参数限制为 32 位。 如果不是,请添加更多条件来限制更大的数字。 我认为您的原始代码无论如何都不会为他们工作,因为至少有一个条件应该评估为真。
For your uints, it should either be
"<= 65535"
or"< 65536"
. Ditto for 232 but the first one (256) is okay.I would go for:
This assumes you'll be limiting arguments to 32 bits. If not, add more conditions to hamdle the larger numbers. I don't think your original code would have worked for them anyway since at least one condition is supposed to evaluate true.
简单来说怎么样:
How about simply: