数字中总位数的对数解背后的解释是什么?
What's the explanation behind logarithmic solution of count total bits in a number?
统计总数的方法有很多种。数字的位和以下是其中之一:-
int total_bits=log2(num)+1;
你能解释一下,log2(num)加1有什么用?
感谢和问候
设n
为正整数。设 k
为它的位数。
然后 n
和 k
由这个数学关系链接:
2^(k-1) ≤ n < 2^k
其中 ^
表示求幂。
现在,对数是严格递增的函数,所以这个关系等价于:
log2(2^(k-1)) ≤ log2(n) < log2(2^k)
并且由于 log2
恰好是 2^...
的反函数,因此等同于:
k-1 ≤ log2(n) < k
或等价地:
k ≤ log2(n) + 1 < k+1
也就是说,整数k
是log2(n) + 1
的整数部分。我们可以这样写:
k = floor(log2(n) + 1)
或C语言:
int k = log2(n) + 1;
注:在这个回答中,我用^
来表示求幂。在大多数编程语言中,^
表示按位异或,与指数完全无关。请小心并避免在程序中使用 ^
作为指数。
这不计算位数,但它可能会也可能不会 return 设置的最高位的索引。
“可能会或可能不会”,因为舍入错误:首先,log2(65536) 可能不是 return 16,而是 15.999999999999999999999,在这种情况下,您会得到错误的答案。其次,如果你需要这个用于 64 位数字,那么我可以保证 log2(0x8000_0000_0000_0000) 或 log2(0x7fff_ffff_ffff_ffff) 会给出错误的结果。
统计总数的方法有很多种。数字的位和以下是其中之一:-
int total_bits=log2(num)+1;
你能解释一下,log2(num)加1有什么用?
感谢和问候
设n
为正整数。设 k
为它的位数。
然后 n
和 k
由这个数学关系链接:
2^(k-1) ≤ n < 2^k
其中 ^
表示求幂。
现在,对数是严格递增的函数,所以这个关系等价于:
log2(2^(k-1)) ≤ log2(n) < log2(2^k)
并且由于 log2
恰好是 2^...
的反函数,因此等同于:
k-1 ≤ log2(n) < k
或等价地:
k ≤ log2(n) + 1 < k+1
也就是说,整数k
是log2(n) + 1
的整数部分。我们可以这样写:
k = floor(log2(n) + 1)
或C语言:
int k = log2(n) + 1;
注:在这个回答中,我用^
来表示求幂。在大多数编程语言中,^
表示按位异或,与指数完全无关。请小心并避免在程序中使用 ^
作为指数。
这不计算位数,但它可能会也可能不会 return 设置的最高位的索引。
“可能会或可能不会”,因为舍入错误:首先,log2(65536) 可能不是 return 16,而是 15.999999999999999999999,在这种情况下,您会得到错误的答案。其次,如果你需要这个用于 64 位数字,那么我可以保证 log2(0x8000_0000_0000_0000) 或 log2(0x7fff_ffff_ffff_ffff) 会给出错误的结果。