Битовая операция в вашем коде
c = 128
, поэтому двоичное представление будет
c = 10000000
a & c
, и каждый i th , но если c
с evert i th бит a
.Поскольку c
имеет только 1
в позиции MSB (поз. 7), поэтому a & c
будет ненулевым, если a
имеет 1
в своей позиции 7 бит, если a
имеет 0
в бите pos, тогда a & c
будет ноль.Эта логика используется в блоке if
выше.Блок if
вводится в зависимости от того, является ли MSB (позиция 7 бит) байта 1 или нет.
Предположим, a = ? ? ? ? ? ? ? ?
, где ?
равен 0
или 1
Тогда
a = ? ? ? ? ? ? ? ?
AND & & & & & & & &
c = 1 0 0 0 0 0 0 0
---------------
? 0 0 0 0 0 0 0
Как 0 & ? = 0
.Таким образом, если битовая позиция 7 равна 0, тогда ответ равен 0, битовая позиция 7 равна 1, тогда ответ равен 1.
На каждой итерации c
сдвигается влево на одну позицию, поэтому 1
в c
размножается слева.Таким образом, в каждой итерации, маскирующей с другой переменной, вы можете узнать, есть ли 1
или 0
в этой позиции переменной.
Используйте в своем коде
У вас есть
union temp
{
float f;
char c[4];
} k;
Внутри объединения float
и char c[4]
совместно используют такое же место в памяти(как собственность союза).Теперь sizeof (f) = 4bytes)
Вы назначаете k.f = 5345341
или что-то еще.Когда вы обращаетесь к массиву k.arr[0]
, он получает доступ к 0-му байту числа с плавающей запятой f
, когда вы делаете k.arr[1]
, он обращается к 1-му байту числа с плавающей запятой f
.Массив не пустой, так как и float, и массив указывают на одну и ту же ячейку памяти, но имеют разный доступ.На самом деле это механизм для доступа к 4 байтам с плавающей запятой.ПРИМЕЧАНИЕ. k.arr[0]
может адресовать последний байт вместо 1-го байта (как сказано выше), это зависит от порядка следования байтов в памяти (см. Порядок байтов с прямым и младшим порядком байтов для этого)
Union k
+--------+--------+--------+--------+ --+
| arr[0] | arr[1] | arr[2] | arr[3] | |
+--------+--------+--------+--------+ |---> Shares same location (in little endian)
| float f | |
+-----------------------------------+ --+
Или порядок следования байтов можно поменять на обратный
Union k
+--------+--------+--------+--------+ --+
| arr[3] | arr[2] | arr[1] | arr[0] | |
+--------+--------+--------+--------+ |---> Shares same location (in big endian)
| float f | |
+-----------------------------------+ --+
Ваш код зацикливается на этом и сдвигает c
, который распространяет только 1
в c
с бита 7 на бит 0 за один шаг ввремя в каждом месте, и побитовое значение anding проверяет фактически каждую битовую позицию байтов переменной с плавающей запятой f
, и печатает 1, если это 1 или 0. 0. 1069 *
Если вы печатаете все 4 байтазатем вы можете увидеть представление IEEE 754.