Объясните следующий метод C ++ - PullRequest
1 голос
/ 06 апреля 2011
#define XL     33           
#define OR      113          
#define NOR     313     
#define TN     344  

int to_bits(int critn,char *mask)
{
       unsigned int x;
       int begin;

       if (critn < XL)           begin = 1;
       else if (critn < OR)      begin = XL;
       else if (critn < NOR)     begin = OR;
       else if (critn <= TN)    begin = NOR;
       else                        begin = 0;
       x = critn - begin;

       *mask = (char)(0x80 >> (x % 8));

       return (int)(x >> 3);    // fast divide by 8  
}

У меня нет никаких знаний о коде C ++. Кто-нибудь может объяснить, что этот метод делает в последних 2 строках?

Спасибо

Ответы [ 4 ]

2 голосов
/ 06 апреля 2011
  *mask = (char)(0x80 >> (x % 8));  

Значение x замаскировано так, что остаются только младшие три бита.Значение 0x80 сдвигается вправо на оставшееся число.Результат присваивается значению, на которое указывает маска.

   return (int)(x >> 3);    // fast divide by 8     

x делится на восемь.Результатом является возвращаемое значение метода.

2 голосов
/ 06 апреля 2011

>> - оператор правого сдвига.

например 8> 3 даст вам 1, двоичное значение с правым сдвигом 8 на 3 места

1000(binary of 8) right shift by 3 places = 0001 (1 in decimal)
2 голосов
/ 06 апреля 2011

Последние две строки сдвинуты в битах.

Маска занимает 0x80 и смещает ее (х на моду 8), например, 5 >> 2 даст вам 1.

x>> 3 - это, как говорится, деление на 8, взятие х и перемещение всех битов на 3 позиции вправо (так что 1,2,4), в результате 8 станет 1 и т. Д. Это немного похоже нацелое число div, но будет быстрее (как говорится в комментарии, быстрое деление на 8)

1 голос
/ 06 апреля 2011

В C ++, как и в большинстве языков программирования, вы можете вернуть только одно значение. Чтобы «вернуть» два значения, обычная практика C / C ++ - возвращать одно и передавать указатель на объект и изменять этот объект через указатель (mask в данном случае).

Объекту, на который указывает mask, будет назначена битовая маска с точно установленным битом. Для этого нужно принять шестнадцатеричное значение 0x80 (1000 0000 в двоичной форме) и сдвинуть его вправо от 0 до 7 шагов. Точное количество шагов определяется x, то есть компьютером, использующим некоторую логику для конкретного приложения.

Возвращаемым значением является x / 8.

Вы можете увидеть подпрограмму как подпрограмму деления, которая возвращает x/8 и остаток (например, x по модулю 8 , но выражается в виде битовой маски, а не целочисленного значения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...