3

私は2倍の自然な大きな数を持っています。私はそれの右端の30ビットを取得する必要があります(不可欠な部分の)。整数の場合、操作は次のとおりです。

var & 0x3FFFFFFF

この目的のためにいくつかの機能を実装できますが、いくつかの簡単な解決策が必要です。ありますか?

*編集:

すべての答えが私にはうまくいきません。説明しようと思います。たとえば、double x = 9362446620820194.0000があり、その数値の整数部分の右端の30ビットは数値957350626です。

doubleの代わりにuint64_tを使用することもできますが、32ビットシステムのサポートが必要です。

psマシン(メモリ)ではなく、単純な2進数表現を意味します

4

2 に答える 2

2

8ビットを想定unsigned char:

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とはいえ、実際にはおよび関連する機能を確認する必要があります。

于 2012-03-11T12:31:48.250 に答える
0

キャストハック:

float var = 0.2987647892;
uint32_t bit_repr = *(uint32_t *)&var;
uint32_t masked = bit_repr & 0x3FFFFFFF;
于 2012-03-11T12:24:23.607 に答える