Если вы хотите работать с фактическим побитовым представлением числа с плавающей запятой, вы должны сделать что-то вроде этого:
float f; /* whatever your float is */
int i = *(int *)&f;
Для этого нужно взять адрес f
с адресом оператора, &
. Этот адрес имеет тип float *
, указатель на число с плавающей точкой. Затем он переписывает его с помощью (int *)
, который говорит: «притворитесь, что этот указатель больше не указывает на float
, но теперь он указывает на int
». Обратите внимание, что это не меняет значение на f
. Затем последний *
(или первый, поскольку мы читаем справа налево) разыменовывает этот указатель, который является указателем на int
, и поэтому возвращает int
, то есть целое число с таким же побитовым представлением, как поплавок.
Чтобы сделать обратное (преобразовать и int i
обратно в float f
), сделать наоборот:
f = *(float *)&i;
Если я не ошибаюсь, эта операция не определена стандартом C, но, вероятно, будет работать на большинстве компьютеров и компиляторов. Он не определен, потому что я считаю, что фактическое представление чисел с плавающей запятой зависит от реализации и может быть оставлено на усмотрение ЦП или компилятора, и поэтому значение i
почти невозможно предсказать после этой операции (то же самое относится и к значение f
в обратном порядке). Это классно используется в функции обратного квадратного корня Джона Кармака для той же гнусной цели.
В любом случае, если вы делаете это в реальном коде, вам, вероятно, следует остановиться и дважды подумать о том, что вы пытаетесь сделать и почему вы используете float
s для этого. Однако, если вы просто делаете это из любопытства, или вы подумали об этом и уверены в своем дизайне и методах, сделайте это.
Меня убеждают, что вы уже знаете, как считать количество битов, установленных в обычном целом числе, поскольку это гораздо более простая задача. Если вы не знаете, ваш компилятор (или язык C, я даже не знаю) может иметь функцию для подсчета битов, или вы можете использовать что-то с замечательного Bit-Twiddling Hacks сайта, у которого есть способы делать такие вещи с помощью побитовых операций (что должно быть довольно быстро).