Проблема с изменением порядка - PullRequest
1 голос
/ 03 февраля 2010

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

, чтобы получить n-й бит, который я могу использовать

(value >> totalNumberOfBits) & 1;

через некоторое времяцикл, который я могу запускать до тех пор, пока totalNumberOfBits == 0;

как таковые

while(totalNumberOfBits!= 0){
     putchar(n >> totalNumberOfBits)&1;
     totalNumberOfBits--;
}

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

спасибо

Ответы [ 6 ]

1 голос
/ 03 февраля 2010

Будет ли это сделано с помощью функции itoa для преобразования числа и сохранения его в буфере и использования пользовательской функции reverse строки, которая возвращает указатель на символ char и преобразовывает указатель в символ char в int снова с помощью функции atoi. Это простой способ сделать это.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STRMAX   50

char *reverse(const char *);

int main(int argc, char **argv){
    static char inpBuf[25];
    char *ptr = NULL;
    int num = 1234;

    /* Convert num to a string */
    itoa(num, inpBuf, 10);

    /* Reverse the string */
    ptr = reverse(inpBuf);

    /* Convert the reversed string back to num */
    num = atoi(ptr);
    /* num is reversed! i.e. 4321 */

    /* Free the pointer */
    if (ptr) free(ptr);
}

char *reverse(const char* sInput) {
    char* sOutput;
    int iCnt = 0, iCntRev;
    sOutput = (char *)malloc((STRMAX * sizeof(char)) + 1);
    if (sOutput){
        for (iCntRev = strlen(sInput); iCntRev >= 0; iCntRev--) {
            *sOutput++ = sInput[iCntRev];
            iCnt++;
        }
        *sOutput++ = '\0';
    }
    return (sOutput - iCnt);
}

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

1 голос
/ 03 февраля 2010

Ваш putchar(n >> totalNumberOfBits)&1 является ошибкой (обратите внимание, где правая фамилия).

Ваш текущий код выводит, казалось бы, случайные значения (основанные на «текущих» и более значащих битах в вашем числе), и если вы просто переместите правильного родителя туда, где вы хотели его поместить, то вы будете писать '\0' и '\1' (которые являются нулем и другим управляющим кодом). Вместо этого вы хотите написать '0' и '1' (цифры ноль и единица).

Это одна из тех вещей, которые лучше всего показаны на примере:

void f() {
  // hardcode total_bits values for this example
  // in reality you'd call your function
  int num = 42; // 101010 in binary
  for (int total_bits = 6; total_bits;) {
    putchar("01"[(num >> --total_bits) & 1]);
  }

  num = 5; // 101 in binary
  // loop written verbosely, but does exactly the same:
  for (int total_bits = 3; total_bits;) {
    --total_bits; // decrement after condition is checked, before used
    int bit = (num >> total_bits) & 1; // bit is always 0 or 1
    char c = "01"[bit]; // c is always '0' or '1'
    putchar(c);
  }
}

Обратите внимание, где находится декремент (можно переместить, если хотите, но не в 3-ю часть цикла for & mdash; это изменило бы порядок вычислений), и этот цикл не обрабатывает случай, когда num равно нулю.

0 голосов
/ 03 февраля 2010
while (totalNumberOfBits != 0) {
     putchar(n >> totalNumberOfBits) & 1;
     totalNumberOfBits--;
}

Хорошо, ваш код был довольно близок (и фактически уже распечатывал биты в правильном порядке), однако было 3 небольших ошибки. Во-первых, при компиляции Visual Studio выдает следующее предупреждение:

warning C4552: '&' : operator has no effect; expected operator with side-effect

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

while (totalNumberOfBits != 0) {
     putchar((n >> totalNumberOfBits) & 1);
     totalNumberOfBits--;
}

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

while (totalNumberOfBits != 0) {
     putchar(((n >> totalNumberOfBits) & 1) ? '1' : '0');
     totalNumberOfBits--;
}

Сейчас это очень близко, осталась только одна маленькая ошибка. Из-за проверки, которую выполняет ваш цикл while, и места, где вы уменьшаете totalNumberOfBits, вы никогда не проверяете бит на 2 ^ 0, в то время как вы проверяете 2 ^ 8, даже если ваш n только 8 бит (и, следовательно, диапазона). Таким образом, мы перемещаем декремент и подставляем !=:

while (--totalNumberOfBits >= 0) {
     putchar(((n >> totalNumberOfBits) & 1) ? '1' : '0');
}
0 голосов
/ 03 февраля 2010

void printbin (int input) { int i; int mask = 0x80000000; // предполагая 32-битное целое для (я = 0; г <32; я ++) { если (маска и ввод) putchar ( '1') еще putchar ( '0'); маска >> = 1; } }

0 голосов
/ 03 февраля 2010
static void
print_binary(int value, int numBits)
{
    /* postfix decrement, so the loop will run numBits times */
    while (0 < numBits--) {

        /*
         * Since numBits was decremented it now is an index to the next bit from
         * the left. So, we shift a one to the left that number of bits, do a
         * bitwise-AND with the value and test whether it is not equal to 0. If
         * so, print a 1. Otherwise, print a 0!
         */
        putchar((value & (1 << numBits)) ? '1' : '0');
    }
}
0 голосов
/ 03 февраля 2010

Вместо смещения вправо, попробуйте смещение влево и закончите с размером WORD. Или используйте WORD size минус количество бит и сначала удалите начальные 0.

Также не забудьте изменить & для соответствия старшему биту.

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