почему мы умножаем (temp >> 11) на 2, чтобы найти второе в этом коде - PullRequest
0 голосов
/ 11 июля 2019
/*program to display hour,minute,and seconds*/

#include<stdio.h>

void times (unsigned int time);

unsigned short hours, minutes, seconds; /*global variables */

int main ()
{
  int time;

  puts ("enter any number(less than 24446)");
  scanf ("%u", &time);

  times (time);

  printf ("for time=%u\n", time);
  printf ("hours=%u\n", hours);
  printf ("minutes=%u\n", minutes);
  printf ("seconds=%u\n", seconds);

  return 0;
}

void times (unsigned int time)
{
  unsigned short int temp;

  hours = time >> 11;
  temp = time << 5;
  minutes = temp >> 10;
  temp = time << 11;
  seconds = (time >> 11) * 2;   /*why multiplying with two? */
}

Ответы [ 2 ]

1 голос
/ 11 июля 2019

В старые дни MSDOS каждая дата и время файла хранились в 16-битном слове.Время было точным до 2 секунд, чтобы привести его в соответствие.

15–11   Hours (0–23)
10–5    Minutes (0–59)
 4–0    Seconds/2 (0–29)

15–9    Year (0 = 1980, 127 = 2107)
 8–5    Month (1 = January, 12 = December)
 4–0    Day (1–31)

Левые сдвиги в коде предназначены для очистки верхних битов, чтобы оставить только необходимое поле (вместо этого можно было сделать битовую маску).

0 голосов
/ 11 июля 2019

Я не знаю, откуда взялся этот код, но, похоже, он исходит от файловых систем DOS или чего-то в этом роде.

В некоторых из этих систем дата и время поразрядно кодируются в двух 16-битных полях, а секунды имеют степень детализации 2 с.

...