Что делает эта часть кода if (kc [3] & c)? - PullRequest
0 голосов
/ 15 мая 2011
#include<stdio.h>
#include<iostream.h>
main()
{
  unsigned char c,i;
  union temp
  {
    float f;
    char c[4];
  } k;
  cin>>k.f;
  c=128;
  for(i=0;i<8;i++)
  {
    if(k.c[3] & c) cout<<'1';
    else cout<<'0';
    c=c>>1;
  }
  c=128;
  cout<<'\n';
  for(i=0;i<8;i++)
  {
    if(k.c[2] & c) cout<<'1';
    else cout<<'0';
    c=c>>1;
  }
  return 0;
}

Ответы [ 4 ]

4 голосов
/ 15 мая 2011
if(k.c[2] & c)

Это называется побитовым И.

Иллюстрация побитового И

   //illustration : mathematics of bitwise AND
   a = 10110101 (binary representation)
   b = 10011010 (binary representation)

   c = a & b 
     = 10110101 & 10011010 
     = 10010000 (binary representation)
     = 128 + 16 (decimal)
     = 144 (decimal)

Битовое И использует эту таблицу истинности:

X | Y | R = X & Y
---------
0 | 0 | 0
0 | 1 | 0
1 | 0 | 0
1 | 1 | 1

См. Эти руководствапоразрядное И:

2 голосов
/ 15 мая 2011

Побитовая операция (в данном случае AND) выполняет побитовую операцию между двумя операндами.Например, &:

11010010 &
11000110 =
11000010
1 голос
/ 15 мая 2011

Битовая операция в вашем коде

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.

1 голос
/ 15 мая 2011

c имеет один установленный бит. 128 - это 10000000 в двоичном виде. if(k.c[2] & c) проверяет, установлен ли этот бит также в k.c[2]. Затем бит в с перемещается, чтобы проверить другие биты.

В результате программа создается для отображения двоичного представления типа float.

...