Как мне сдвинуть бит без знака долго в C? - PullRequest
0 голосов
/ 01 ноября 2018

Я попробовал все, чтобы понять это, и я не понимаю, что я делаю неправильно. преобразование в подписанное делает все после числовых шестнадцатеричных значений, и я знаю, что если у меня есть целое число, я могу прямо использовать «ULL» для его преобразования и сдвига битов, но я не могу понять,

в основном

void   tick(unsigned long* tmp) { //input as a parameter
   signed long temp = tmp;

   printf("%x\n", temp >> 16 & 0xff);

   tmp = (signed) temp;

   return;
}

РЕДАКТИРОВАТЬ: так что я глуп, и я должен был использовать% lu, а не% x, теперь я могу видеть свои результаты, но я не вижу никаких изменений, происходящих с часами, даже с сдвигом битов температуры

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Из информации в комментариях вы на самом деле вывели свое целое число, например, в часах / минутах / секундах / часах-часах с 2 байтами (убедитесь, что вы имели в виду 2 байта, а не 2 полубайта) для каждого поля, например, например. это:

+--+--+--+--+--+--+--+--+
|H |H |M |M |S |S |AM PM|
+--+--+--+--+--+--+--+--+

И вы хотите извлечь 2 байта, содержащие секунды, и добавить к ним 1.

Вам понадобится 8 байтов (64 бита) для представления этого значения, поэтому я буду использовать тип uint64_t вместо беззнакового длинного для этого, вы получите тип uint64_t на #include <stdint.h>

void tick(uint64_t *value) { //input as a parameter
  //extract seconds 
  unsigned int seconds ((*value) >> 16) & 0xffff

  printf("seconds = %u\n", seconds);

 //add 1 second and pack the value back:
 seconds += 1;
 *value = (value & 0xffffffff0000ffff) | ((seconds & 0xffff) << 16);

 return; //returns void
}

(Теперь вам также может понадобиться обработать перенос, например, увеличить минуту, когда секунды достигают 60 и т. Д.)

0 голосов
/ 01 ноября 2018
  • Параметр функции является указателем, поэтому вам нужно разыменовать его, чтобы получить доступ к его значению.
  • Вам необходимо присвоить значение битовой сдвиг для вашей переменной, если вы хотите сохранить его.
  • И если вы хотите, чтобы значение изменялось под указателем, вам нужно присвоить новое значение разыменованному указателю
  • Вам также необходимо использовать параметры длинного форматирования для правильного отображения. (Здесь люкс -> шестнадцатеричное длинное без знака)

Вот модифицированная версия:

#include <stdio.h>

void    tick(unsigned long* input)
{
  unsigned long temp;

  temp = ((*input) >> 16) & 0xff;
  printf("%lux\n", temp);

  *input = temp;
}

int main()
{
  long test = 1;
  tick(&test);
  test = 0b100000000000000000;
  tick(&test);
  test = 0b111111111111111111;
  tick(&test);
}
...