Извлечение правых N бит двойного в C - PullRequest
3 голосов
/ 11 марта 2012

У меня есть натуральное большое число в двойном числе. Мне нужно получить 30 самых правых битов (неотъемлемой части). Если это было целое число, операция была бы:

var & 0x3FFFFFFF

Я могу реализовать некоторые функции для этой цели, но мне нужно простое решение. Есть ли один?

* редактировать:

Все ответы не работают для меня. Я попытаюсь объяснить: например, у меня есть двойной x = 9362446620820194.0000, 30 правых битов неотъемлемой части этого числа это число 957350626.

Я мог бы использовать uint64_t вместо double, но мне нужна поддержка 32-битных систем.

p.s. Я имею в виду простое представление двоичных чисел, а не машины (память)

Ответы [ 2 ]

2 голосов
/ 11 марта 2012

Предполагая 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 и связанные с ним функции.

0 голосов
/ 11 марта 2012

Взлом на кастинг:

float var = 0.2987647892;
uint32_t bit_repr = *(uint32_t *)&var;
uint32_t masked = bit_repr & 0x3FFFFFFF;
...