Member 13635589 Ответов: 2

Я запутался в том, что я должен изменить в функции printcharasbinary() для работы с целыми числами при создании функции printintasbinary ().


Здравствуйте, мне дана функция printCharAsBinary(unsigned char number) в файле binaryformat.c. я должен создать вторую функцию printIntAsBinary(unsigned int number) для работы с целыми числами. Однако я запутался в том, что я должен изменить в функции printCharAsBinary() для работы с целыми числами при создании функции printIntAsBinary ().

Binaryformat.c с функцией printCharAsBinary.
#include <xc.h>         // library of functions for this chip 
#include <stdio.h>      // library containing printf() function


void printIntAsBinary(unsigned int number);
void WaitOneSecond(void);

int main(void)  
{
    unsigned i = 0;
    configureUSART(9600ul, 1); // configure MCU serial communication module to run at 9600 baud 
                               // defined in configureUSART.c

    WaitOneSecond();   // The splash screen lasts about one second
                       // LCD will not respond to printf() until it is finished.



    for(i=0; i < 256; i++)
      {
	printf("\n\r %u = ",i);
        printIntAsBinary((unsigned int)i);
        
      }                         

while(1)
   {
	  // MCUs run continuously so an endless loop is required.
   }
}	


void printIntAsBinary(unsigned int number)
{

if ( ((number & 0b10000000) >> 7 ) == 1)
   printf("0b1");
else
   printf("0b0");

if ( ((number & 0b01000000) >> 6 ) == 1)
   printf("1");
else
   printf("0");


if ( ((number & 0b00100000) >> 5 ) == 1)
   printf("1");
else
   printf("0");


if ( ((number & 0b00010000) >> 4 ) == 1)
   printf("1");
else
   printf("0"); 


if ( ((number & 0b00001000) >> 3 ) == 1)
   printf("1");
else
   printf("0");


if ( ((number & 0b00000100) >> 2 ) == 1)
   printf("1");
else
   printf("0");

if ( ((number & 0b00000010) >> 1 ) == 1)
   printf("1");
else
   printf("0");


if ( ((number & 0b00000001) ) == 1)
   printf("1");
else
   printf("0");

}


void WaitOneSecond(void)
{
int  i = 0;
for(i=0; i<=5; i++) 
   {
    _delay(50000ul);  // 50 000 * 4 / 1 000 000 = 1/5 s 
   }
}


Что я уже пробовал:

Я не уверен, как решить эту проблему.Мне дана функция printCharAsBinary(unsigned char number) в файле binaryformat.c. я должен создать вторую функцию printIntAsBinary(unsigned int number) для работы с целыми числами. Однако я запутался в том, что я должен изменить в функции printCharAsBinary() для работы с целыми числами при создании функции printIntAsBinary ().

Dotnet_Dotnet

сэр где вы определяете printintasbinary

Member 13635589

Привет, это функция printCharAsBinary. Я все еще должен создать функцию printIntAsBinary. Вопрос заключается в том, что я буду использовать функцию printCharAsBinary fnction для работы с целыми числами?
Спасибо,
Я очень запутался

CPallini

Ты нам ничего не показал printCharAsBinary определение.

Member 13635589

Привет, это функция printCharAsBinary. Я все еще должен создать функцию printIntAsBinary. Вопрос заключается в том, что я буду использовать функцию printCharAsBinary fnction для работы с целыми числами?
Спасибо,
Я очень запутался

Richard MacCutchan

Вы должны научиться создавать циклы для повторения одних и тех же инструкций.

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

Member 13635589

Привет, это функция printCharAsBinary. Я все еще должен создать функцию printIntAsBinary. Вопрос заключается в том, что я изменю на printCharAsBinary fnction для работы с целыми числами?
Спасибо,
Я очень запутался

Richard MacCutchan

Сначала вам нужно преобразовать целое число в строку символов. Затем для каждого символа вы печатаете с помощью существующего метода.

Member 13635589

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

Richard MacCutchan

Итак, реальный вопрос, который вы должны были задать здесь, состоял в том, как преобразовать целое число в строку символов. Основная концепция заключается в том, что вы многократно делите целое число на 10, пока оно не выйдет из нуля. На каждом шаге вы берете остаток деления, и это следующая цифра нижнего порядка, и вы должны добавить базу символов, чтобы сделать ее символом. Итак, что-то вроде:

char Remainder = IntegerValue % 10; // the % operator gives the remainder from the division
Remainder += '0'; // make it a printable character ...
//
// This is the low order character of the string
//
IntegerValue /= 10; // divide by 10 to reduce the value
If IntegerValue > 0 Repeat the above ...

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

2 Ответов

Рейтинг:
2

Rick York

Вот один из способов реализации отображения байта в двоичной форме :

typedef unsigned char uchar;

void PrintByteInBinary( uchar byte )
{
    uchar mask = 0x080;  // set initially to most significant bit
    int n;
    for( n = 0; n < 8; ++n )
    {
        printf( "%s", byte & mask ? "1" : "0" );
        mask >>= 1;
    }
}

Вы можете передавать в отдельные байты данные любого типа и размера. Вот способ использовать объединение, чтобы вы могли легко извлечь байты :
typedef union
{
    uchar  bytes[8];
    int    intvalue;
    short  shortvalue;
    float  floatvalue;
    double doublevalue;
} ByteUnion;

Если вы зададите intvalue целочисленное значение, то вы можете передать отдельные байты в функцию печати, чтобы отобразить их. Вот функция, которая будет печатать столько байтов, сколько у вас есть, и пример ее использования.

void PrintBytesInBinary( uchar *bytes, int byteCount )
{
    int n;
    for( n = 0; n < byteCount; ++n )
         PrintByteInBinary( bytes[n] );
}

void PrintValues( void )
{
   ByteUnion bu = { 0 };

   bu.intvalue = 42;
   PrintBytesInBinary( bu.bytes, sizeof( int ) );

   bu.shortvalue = 96;
   PrintBytesInBinary( bu.bytes, sizeof( short ) );

   bu.floatvalue = 3.1415f;
   PrintBytesInBinary( bu.bytes, sizeof( float ) );

   bu.doublevalue = 1.4142;
   PrintBytesInBinary( bu.bytes, sizeof( double ) );
}
Я не тестировал этот код, но он должен быть близок к функциональному. Удачи.


Rick York

Конечно, использовать союз не обязательно. Можно просто передать адрес значения и использовать приведение, чтобы сделать его подходящим типом. На самом деле это немного проще.

Рейтинг:
2

KarstenK

Как уже было сказано ранее, все биты находятся в памяти, но вы должны правильно их интерпретировать. Таким образом, повторение в буфере памяти сделает свою работу.

char buffer[4];
memcpy( buffer, &uiMemory, 4 );// make copy of the bits for clarity  

for( int i = 0; i < 4; i++ ) {
 printCharAsBinary( buffer[i]);
}
вы также можете делать причудливые вещи указателя - по этой причине я люблю C++
char *p = (char*) &uiMemory;//assign address of the ui to char* p

for( int i = 0; i < 4; i++ ) {
 printCharAsBinary( p[i]);
}


Member 13635589

Привет, это функция printCharAsBinary. Я все еще должен создать функцию printIntAsBinary. Вопрос заключается в том, что я изменю на printCharAsBinary fnction для работы с целыми числами?
Спасибо,
Я очень запутался

Member 13635589

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

KarstenK

Это не обман, А C/C++, как он должен быть развернут. Хороший учебник о смещении битов: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AdvancedOperators.html#//apple_ref/doc/uid/TP40014097-CH27-ID28