Двоичный сдвиг вправо, только добавление - PullRequest
0 голосов
/ 31 марта 2011

Я работаю над проектом, в котором я читаю ячейки памяти, и мне нужно вывести их шестнадцатеричное значение в ASCII.

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

Я подумал, что могу создать желаемый эффект, сдвигая влево и проверяя наличие отрицательного флага, чтобы добавить 1 к концу после сдвига, но я полагаю, что должен быть лучший способ сделать это.

Любое понимание будет оценено.

Ответы [ 4 ]

0 голосов
/ 02 апреля 2011

Итак, оригинальный метод, который я использовал, работал.Я также придумал другую, если у кого-нибудь снова возникнет эта проблема.

Я создал подпрограмму, которая оценивает 4 бита за раз и создает число на основе оценки, для некоторого псевдокода в стиле C это выглядит такэто:

16bitSignedInt bin; //binary being analyzed
int value; //number being built

for (int i = 0; i < 4; i++) // while 0-3, for each nibble of the 16 bits
{
   if (bin.bit15 = 1)
      value += 8; // dominate bit in nibble

   bin <<= 1; // left shift 1

   if (bin.bit15 = 1)
      value += 4; // 2nd bit in nibble

   bin <<= 1; // left shift 1

   if (bin.bit15 = 1)
      value += 2; // 3rd bit in nibble

   bin <<= 1; // left shift 1

   if (bin.bit15 = 1)
      value += 1; // last bit in nibble

   bin <<= 1; // left shift 1

   //do work with value
}

Грубый, но эффективный.

0 голосов
/ 31 марта 2011

У вас есть дополнение с переносом?Вместо отрицательного теста добавьте бит с конца и добавьте ноль с переносом, чтобы вернуть его справа.на самом деле не сильно экономит.До сих пор я не могу придумать другое решение, сдвинуть влево, немного протестировать, если установить добавить 1 к чему-то и сдвинуть это что-то:

uint a,b,i;

b=0;
for(i=0;i<4;i++)
{
   b=b+b;
   if(a&0x8000) b+=1;
   a=a+a;
}

Если значение uint выше 16 бит, то вышеупомянутое даст вам правосмещение 12. a будет уничтожено в процессе создания b, как написано.

0 голосов
/ 31 марта 2011

Вы можете попробовать это в обратном порядке: вместо того, чтобы реализовать правильный сдвиг, вы можете использовать грубую силу. Вот пример для самого высокого клева:

unsigned rez, tmp;
for (rez = 0, tmp = some_word & 0x0FFF; tmp != some_word; rez++, tmp += 0x1000);
0 голосов
/ 31 марта 2011

Используя AND, вы можете установить все биты в ноль, кроме последнего значащего клева:

0101010111010101
0000000000001111 AND
----------------
0000000000000101

Сдвигая все правильно, вы можете прочитать следующий клев:

0101010111010101 SHR 4
----------------
    010101011101
0000000000001111 AND
----------------
0000000000001101

Вам это нужно?

...