これは宿題の質問です。
符号なし整数表現を検討してください。次を含む10進数を格納するために必要なビット数:
i) 3 digits ii) 4 digits iii) 6 digits iv) n digits
符号なし整数の範囲は0から2 ^ nになることは知っていますが、数値を表現するのに必要なビット数がそれに依存する方法がわかりません。私を助けてください。
前もって感謝します。
まあ、各ケースの範囲を計算し、その範囲よりも高い2の最小のべき乗を見つける必要があります。
たとえば、i)で、3桁の10進数-> 10 ^ 3 = 1000の可能な数なので、1000よりも大きい2の最小のべき乗、この場合は2 ^ 10 = 1024(10ビット)を見つける必要があります。
編集:基本的に、あなたが持っている桁数で可能な数の数を見つけ、次にどの桁数(もう一方のベース、この場合はベース2、バイナリ)が少なくともあるかを見つける必要があります10進数と同じ可能な数字。
与えられた桁数で可能性の数を計算するには:possibilities=base^ndigits
したがって、10進数で3桁(基数10)の場合、10^3=1000
の可能性があります。次に、可能性の数が少なくとも1000になるように、2進数(ビット、基数2)の桁数を見つける必要があります。この場合、2^10=1024
(1000未満の2^9=512
で9桁では不十分です)。
これを一般化すると、次のようになります:2^nbits=possibilities <=> nbits=log2(possibilities)
I)に適用されるlog2(1000)=9.97
は、ビット数が整数である必要があるため、10に切り上げる必要があります。
n整数(たとえば、からn-1)を格納するために必要なバイナリビット数の式は次のとおりです。
そして切り上げます。
たとえば、値-128〜127(符号付きバイト)または0〜255(符号なしバイト)の場合、整数の数は256なので、nは256であり、上記の式から8が得られます。
からnの場合、上記の式でn + 1を使用します(n + 1整数があります)。
電卓でlogeは、単にlogまたはln(自然対数)とラベル付けできます。
数を表すのに必要なビット数のテクニックを一般化するには、このようにします。表現にRシンボルがあり、ビット数を知りたい場合は、この方程式R = 2 ^ nまたはlog2(R)= nを解きます。ここで、nはビット数、Rは表現のシンボル数です。
10進数システムR = 9の場合、9 = 2 ^ nを解くため、答えは10進数字あたり3.17ビットです。したがって、3桁の数字には9.51ビットまたは10が必要です。1000桁の数字には3170ビットが必要です
n基数の桁数bで表現できる最大数はbn -1。したがって、[〜#〜] n [〜#〜] 2進数で表現できる最大数は2N -1。最小の整数[〜#〜] n [〜#〜]が必要です。
2N -1≥bn -1
⇒2N ≥bn
最後の式の両側の底2の対数を取ると、次のようになります。
ログ2 2N ≥ログ2 bn
⇒N≥ログ2 bn
⇒N≥log bn /ログ2
最後の関係を満たす最小の整数[〜#〜] n [〜#〜]が必要なので、[〜#〜] n [〜#〜] 、検索log bn / log 2そして天井を取ります。
最後の式では、両方の底が同じである限り、底は対数に適しています。ここでは、b = 1の場合に興味があるため、log1010n == n。
n =の場合:
N =⌈3/ログ10 2⌉= 10
n = 4の場合:
N =⌈4/ログ10 2⌉= 14
n = 6の場合:
N =⌈6/ログ10 2⌉= 20
そして一般的に、n 10進数の場合:
N =⌈n/ログ10 2⌉
商が0になるまで、数値を2で除算し続けます。
その必要なnビットを2 ^ n =(base)^ digitとし、ログを取り、noをカウントします。 n
これは動作します!
floor(loge(n) / loge(2)) + 1
負の数を含めるには、ビットを追加して符号を指定できます。
floor(loge(abs(n)) / loge(2)) + 2
短い答えは:
int nBits = ceil(log2(N));
それは、単にpow(2、nBits)がNよりわずかに大きいためです。
N桁の2進数の場合、保持できる最大の10進数値は
2 ^ n-1、および2 ^ nは、これらの多くの数字を使用して生成できる順列の合計です。
3桁だけが必要なケース、つまり、ケース1を取り上げます。要件は次のとおりです。
2 ^ n-1> = 999
両側にログを適用し、
log(2 ^ n-1)> = log(999)
log(2 ^ n)-log(1)> = log(999)
n = 9.964(約)。
9.964は有効な桁数にならないため、nのceil値を取得すると、n = 10になります。
ここには多くの答えがありますが、同じ問題に取り組んでいるときにこの投稿を見つけたので、アプローチを追加します。
ここでわかっていることから始まり、0から16までの数字です。
Number encoded in bits minimum number of bits to encode
0 000000 1
1 000001 1
2 000010 2
3 000011 2
4 000100 3
5 000101 3
6 000110 3
7 000111 3
8 001000 4
9 001001 4
10 001010 4
11 001011 4
12 001100 4
13 001101 4
14 001110 4
15 001111 4
16 010000 5
休憩を見て、それはこの表を示しています
number <= number of bits
1 0
3 2
7 3
15 4
それでは、パターンをどのように計算するのでしょうか?
対数ベース2(n)=対数ベース10(n)/対数ベース10(2)
number logb10 (n) logb2 (n) ceil[logb2(n)]
1 0 0 0 (special case)
3 0.477 1.58 2
7 0.845 2.807 3
8 0.903 3 3 (special case)
15 1.176 3.91 4
16 1.204 4 4 (special case)
31 1.491 4.95 5
63 1.799 5.98 6
これで、最初のテーブルに一致する望ましい結果が得られました。一部の値が特殊なケースであることに注意してください。 0および2の累乗の数値。これらの値は上限を適用しても変更されないため、最小ビットフィールド長を取得するには1を追加する必要があることがわかります。
特殊なケースを説明するには、入力に1を追加します。 pythonで実装された結果のコードは:
from math import log
from math import ceil
def min_num_bits_to_encode_number(a_number):
a_number=a_number+1 # adjust by 1 for special cases
# log of zero is undefined
if 0==a_number:
return 0
num_bits = int(ceil(log(a_number,2))) # logbase2 is available
return (num_bits)
最も簡単な答えは、必要な値をバイナリに変換し、その値に必要なビット数を確認することです。ただし、質問では、10進数のX桁のビット数を尋ねます。この場合、X桁の最大値を選択し、その数値をバイナリに変換する必要があるようです。
基本的な例として、1桁の10進数を保存し、必要なビット数を知りたいと仮定します。最大の1桁の10進数は9なので、バイナリに変換する必要があります。これにより、合計4ビットの1001が生成されます。この同じ例を2桁の数値に適用できます(最大値は99で、1100011に変換されます)。 n桁を解決するには、おそらく他を解決してパターンを検索する必要があります。
値をバイナリに変換するには、商が0になるまで繰り返し2で除算します(残りはすべて0または1になります)。次に、剰余の順序を逆にして、バイナリの数値を取得します。
例:13からバイナリ。
これがお役に立てば幸いです。