На CodeProject существует статья, которая кратко обсуждает за и против тестирования закрытых методов. Это тогда обеспечивает некоторый отражательный код для доступа к закрытым методам (подобный коду, который Marcus обеспечивает выше.) Единственная проблема, которую я нашел с образцом, - то, что код не принимает во внимание перегруженные методы.
можно найти статью здесь:
#include <stdio.h> /* for printf() */
#include <limits.h> /* for CHAR_BIT */
int main(void) {
/* union method */
{
/* a union can only be initialized for the first option in the union */
union { float f; char cs[sizeof(float)]; } const focs = { 1.0 };
int j,k;
int count = 0;
for (j = 0; j < sizeof(float); j++)
{
char const byte = focs.cs[j];
for (k = 0; k < CHAR_BIT; k++)
{
if ((1 << k) & byte)
{
count++;
}
}
}
printf("count(%2.1f) = %d\n", focs.f, count);
}
/* cast method */
{
float const f = 2.5;
int j,k;
int count = 0;
for (j = 0; j < sizeof(float); j++)
{
char const byte = ((char *)&f)[j];
for (k = 0; k < CHAR_BIT; k++)
{
if ((1 << k) & byte)
{
count++;
}
}
}
printf("count(%2.1f) = %d\n", f, count);
}
return 0;
}
Если вы хотите работать с фактическим побитовым представлением числа с плавающей запятой, вы должны сделать что-то вроде этого:
float f; /* whatever your float is */
int i = *(int *)&f;
При этом берется адрес f
с оператором адреса и
. Это адрес типа float *
, указатель на float. Затем он переделывает его с помощью (int *)
, в котором говорится, что «притворимся, что этот указатель больше не указывает на float
, но теперь он указывает на int
". Обратите внимание, что он вообще не меняет значение f
. Затем последний *
(или первый, поскольку мы читаем справа налево) разыменовывает этот указатель, который является указателем на int
, и поэтому возвращает int
, или целое число с тем же поразрядным представлением, что и число с плавающей запятой.
Чтобы сделать обратное (преобразовать и int i
обратно в float f
), сделайте противоположное:
f = *(float *)&i;
Если я не ошибаюсь, эта операция не определена C стандартный, но, вероятно, будет работать на большинстве компьютеров и компиляторов. Он не определен, потому что я считаю, что фактическое представление чисел с плавающей запятой зависит от реализации и может быть оставлено на усмотрение ЦП или компилятора, и поэтому значение i
практически невозможно предсказать после этой операции. (то же самое касается значения f
в обратной операции). Он широко используется в функции обратного квадратного корня Джона Кармака для той же гнусной цели.
В любом случае, если вы делаете это в реальном коде, вам, вероятно, следует остановиться и дважды подумать над тем, что вы пытаетесь сделать и почему. ' re использовать для этого float
. Однако, если вы делаете это просто из любопытства, или вы думали об этом и уверены в своем замысле и методах, дерзайте.
Я убежден, что вы уже знаете, как считать числа бит установлен в обычное целое число, так как это намного более простая задача. Если вы не знаете, ваш компилятор (или язык C, я даже не знаю) может иметь функцию для подсчета бит, или вы можете использовать что-нибудь с замечательного веб-сайта Bit-Twiddling Hacks , у которого есть способы делать подобные вещи с помощью побитовых операций (что должно быть довольно быстрым).
m привело к мысли, что вы уже знаете, как подсчитать количество битов, установленных в обычном целом числе, поскольку это намного более простая задача. Если вы не знаете, ваш компилятор (или язык C, я даже не знаю) может иметь функцию для подсчета бит, или вы можете использовать что-нибудь с замечательного веб-сайта Bit-Twiddling Hacks , у которого есть способы делать подобные вещи с помощью побитовых операций (что должно быть довольно быстрым). m привело к мысли, что вы уже знаете, как подсчитать количество битов, установленных в обычном целом числе, поскольку это намного более простая задача. Если вы не знаете, ваш компилятор (или язык C, я даже не знаю) может иметь функцию для подсчета бит, или вы можете использовать что-нибудь с замечательного веб-сайта Bit-Twiddling Hacks , у которого есть способы делать подобные вещи с помощью побитовых операций (что должно быть довольно быстрым).Вы имеете в виду биты, установленные в представлении числа с одинарной точностью IEEE-754? Если это так, преобразуйте его в int (и float, и int имеют ширину 32 бита) и выполните обычный подсчет бит: SO, вопрос № 109023 .
Хорошая функция для подсчета установленных битов в целых числах, упомянутых в первом ответе:
int NumberOfSetBits(int i)
{
i = i - ((i >> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
return ((i + (i >> 4) & 0xF0F0F0F) * 0x1010101) >> 24;
}
Чтобы использовать ее на своем float, вы должны сделать что-то вроде этого:
//...
float f;
//...
int numBitsOfF = NumberOfSetBits(*(int*) &f);
The following function will find the number of bits in a 32-bit number. Just type case your float with integer and call this function by a cast
float f=3.14f;
count_bits(*(int *)&f);
int count_bits(int v)
{
// count the number of bits set in v
int c; // c accumulates the total bits set in v
int b=v;
for (c = 0; v; c++)
{
v &= v - 1; // clear the least significant bit set
}
//printf("No of bits in %d is %d\n",b,c);
return c;
}