2012-03-11 10 views
3

大きな数値が2倍です。私はそれの30右端ビット(不可欠な部分)を取得する必要があります。 それは整数演算あった場合は、次のC内のダブルの右端Nビットを抽出

var & 0x3FFFFFFF 

私は目的のためにいくつかの機能を実装することができますが、私はいくつかの簡単なソリューションを必要としています。 1つはありますか?

*編集:

すべての回答は私のためには機能しません。 私が説明しよう:例えば私は、x = 9362446620820194.0000ダブルを持って、その数値の整数部分の30の右端のビットは、私はuint64_tを使う代わりに、二重、私は32ビットのサポートを必要とすることができる数957350626.

ですシステム。

P.S.私は単純なバイナリ数値表現ではなく、マシン(メモリ)

+2

何の右端30ビットですか?重要なのは?これは、スケールされたログベース2の値の一部になります。指数と符号ビットはどうですか? – talonmies

+0

彼らはあなたが求めていることを理解していないように見えるので、動作しません。まず、IEEE-754バイナリ64形式の[このリンク](http://en.wikipedia.org/wiki/Double-precision_floating-point_format#IEEE_754_double-precision_binary_floating-point_format:_binary64)を読んでください。 – talonmies

+2

32ビットシステムでは 'uint64_t'を使うことができます。 – interjay

答えて

0

に鋳造ハックを意味:

8ビット unsigned charと仮定すると、
float var = 0.2987647892; 
uint32_t bit_repr = *(uint32_t *)&var; 
uint32_t masked = bit_repr & 0x3FFFFFFF; 
+2

これは、厳密なエイリアシングルールに違反し、未定義の動作を引き起こすと思います。 –

+0

浮動小数点数からビットを抽出したい場合でも、コンパイラがどの実装を使用しているかわからないので、未定義のIMHOです。 –

+0

浮動小数点数からビットを取得すると、UBではなく*実装定義の*動作が得られます。 –

2

:本当に、あなたはを見ている必要がありますが

unsigned char const *p = (unsigned char const *)&var; 
long rightmost30 = (p[sizeof(double) - 4] & 0x3F) << 24 
       | p[sizeof(double) - 3] << 16 
       | p[sizeof(double) - 2] << 8 
       | p[sizeof(double) - 1]; 

frexpおよび関連する機能。

+0

これは、ビッグエンディアンシステムでのみ機能します。右端のビットが常に最後のバイトであると仮定しているからです。 – interjay

+0

@interjay:私はOPがメモリ表現の右端のビットを意味していると仮定しました。そうでないと、浮動小数点型にはあまり意味がありません。 –

+1

IEEE-754で定義されているフォーマットの右端のビットを見る方が意味があると思います。これは、仮数部の右端のビットに対応します。これは、リトルエンディアンアーキテクチャの最初のバイトに格納されます。もちろん、OPが実際に必要としていることが分かっていない限り、私たちはそれを知りませんし、彼は明確化の要求に答えることもないので、私はこれを閉じようとしています。 – interjay

関連する問題