Создание дубликатов байтов из заданной функции

#c #bit #masking

Вопрос:

Итак, у меня есть приведенный ниже код, который сдвигает 32-битный int на 6 битов влево ( s-gt;data ), а затем добавляет последние 6 битов int operand к int s-gt;data . Я хотел бы использовать этот код для создания функции, которая принимает unsigned char x и копирует x в первые 3 байта данных int s-gt;, оставляя последний байт равным 0. Так, например , если бы у нас было x = 255, то данные s-gt;в двоичной форме были бы 11111111 11111111 11111111 000000000. Кто-нибудь знает, как этого можно достичь, используя приведенный ниже код (команда обработки данных). Итак, если я могу сдвинуть влево только на 6 бит и добавить 6 бит в конец данных s -gt;, как я могу получить что-то из приведенной выше формы?.

Я знаю, как получить, скажем, 255, используя s-gt;данные (мы командуем данными(128 64 (255/64))) за ним следует команда обработки данных(128 64 (255d)). Это предполагает, что для начала s-gt;данные равны 0. Таким образом, это даст 00000000 00000000 00000000 11111111. Тем не менее , я хотел бы что-то из формы 11111111 11111111 11111111 00000000.

Я действительно теряюсь в догадках о том, как это сделать, поэтому любая помощь была бы очень признательна. Ниже приведена функция dataCommand. Спасибо. Как всегда, можно предположить, что для начала s-gt;данные равны 0.

 void dataCommand(int operand, state *s) {  printf("DATA BEFORE IS %xn", s-gt;data);  // shifts bits of current data fields six positions to left  s-gt;data = s-gt;data lt;lt; 6;  // (operand amp; 63) masks 6 bits off the operand  // then we combine 6 bits of data with 6 bits of operand  s-gt;data = (s-gt;data | (operand amp; 63));  printf("DATA AFTER %xn", s-gt;data);  }  

Комментарии:

1. Что это за тип s-gt;data ? I would like to use this code to create a function which takes an unsigned char x Почему вы хотите использовать этот код? Напишите другой код, зачем использовать именно это? If i can only shift left by 6 bits and append 6 bits to the end of s-gt;data, Почему вы хотите дублировать байт 3 раза, используя эту конкретную функцию ? Используя конкретно сдвиги в 6 бит? Просто напишите другую функцию, которая использует другой код, и используйте сдвиги, кратные 8 . Кроме того, int s-gt;data — не используйте int s для переключения-приведите к unsigned int перед выполнением каких-либо операций.

Ответ №1:

В комментариях MyFunction ниже объясняется, как это сделать.

 #include lt;stdbool.hgt; #include lt;stdint.hgt; #include lt;stdio.hgt;   typedef struct state { int x, y, tx, ty; unsigned char tool; unsigned int start, data; bool end;} state;   void dataCommand(int operand, state *s) {  printf("DATA BEFORE IS %xn", s-gt;data);  // shifts bits of current data fields six positions to left  s-gt;data = s-gt;data lt;lt; 6;  // (operand amp; 63) masks 6 bits off the operand  // then we combine 6 bits of data with 6 bits of operand  s-gt;data = (s-gt;data | (operand amp; 63));  printf("DATA AFTER %xn", s-gt;data);  }  void MyFunction(unsigned char x, state *s) {  /* Create the target pattern that contains 0 in byte 0 and x in bytes 1,  2, and 3.  */  uint32_t p = 0x01010100u * x;   /* For each six bits in p, or fragment thereof, in order from high bits to  low bits, shift those six bits down to the low six bits and give that  to dataCommand to insert into s-gt;data.  */  dataCommand(p gt;gt; 6*5, s);  dataCommand(p gt;gt; 6*4, s);  dataCommand(p gt;gt; 6*3, s);  dataCommand(p gt;gt; 6*2, s);  dataCommand(p gt;gt; 6*1, s);  dataCommand(p gt;gt; 6*0, s); }   int main(void) {  state s;  MyFunction(0x45, amp;s);  printf("data = 0xx.n", s.data); }  

Комментарии:

1. большое вам спасибо, я прочитаю это сейчас

2. каков тип p gt;gt;gt; 6*n, где n-любое значение от 0 до 5?

3. на самом деле это не работает, и я получаю следующую ошибку переполнения целого числа со знаком: 16843008 * 255 не может быть представлено в типе «int» извините .