Консультация № 176191
21.01.2010, 19:01
0.00 руб.
0 6 3
Нужно решить задачу по С.
Постановка задачи:
Не используя стандартную функцию, кроме strlen, реализовать в виде собственной функции следующий алгоритм: преобразовать целое неотрицательное число в строку, содержащую его двоичное представление.

Обсуждение

Неизвестный
21.01.2010, 19:34
общий
это ответ
Здравствуйте, animestyle.

Программа в приложении

Приложение:
// Не используя стандартную функцию, кроме strlen,
// реализовать в виде собственной функции следующий алгоритм:
// преобразовать целое неотрицательное число в строку,
// содержащую его двоичное представление

#include <stdio.h>

void int2bin (unsigned int a, char * s) {
char *p = s;
char t;

// цикл построения двоичного представления числа
do {
*p++ = (a & 1) + '0'; // проверяем на четность и записываем либо '0', либо '1'
a >>= 1; // делим исходное число пополам
} while (a != 0); // повторяем, пока число не станет равным 0

*p-- = '\0'; // заносим в строку признак конца строки и перемещаем указатель на последний символ строки

// "Переворачиваем" строку: при формировании строки она заполнялась в обратном порядке - младшие разряды записывались слева
for (char *q = s; q < p; q++) {
// Обмениваем соответствующие символы (симметричные относительно центра строки)
t = *q;
*q = *p;
*p-- = t;
}
}

void main () {
unsigned int a; // вводимое число
char s [20]; // буфер для хранения двоичного представления (достаточно даже 17-ти символов)

// Запрашиваем число
printf ("\nВведите число: ");
scanf ("%u", &a);

// Преобразуем
int2bin (a, s);

// Выводим
printf ("Двоичное представление числа %u равно %s\n", a, s);
}
5
давно
Академик
320937
2216
22.01.2010, 10:36
общий
23.01.2010, 02:15
это ответ
Здравствуйте, animestyle. Предлагается несколько иной способ формирования битовой строки. Не записываются лидирующие нули. Проверено CodeBlocks/G++.

Приложение:
/*
Постановка задачи:
Не используя стандартную функцию, кроме strlen,
реализовать в виде собственной функции следующий алгоритм:
преобразовать целое неотрицательное число в строку,
содержащую его двоичное представление.
*/
/*
На основе :Брюс Эккель. Философия C++. Введение в стандартный C++, Питер, 2004
C03: printBinary.cpp
*/
#define YES 1
#define NO 0
#include <stdio.h>
using namespace std;
void int2bin(const unsigned int a, char *s);
int main()
{
unsigned int val;
char s[80];
printf("val=");
scanf("%u", &val);
int2bin(val, s);
printf("binary(%u)=%s\n", val, s);
return 0;
}

void int2bin(const unsigned int val, char *s)
{
int leading_zeros=YES; /* допустим, есть лидирующие нули */
int n=sizeof(unsigned int)*8; /* всего двоичных цифр, включая лидирующие нули */
int i=0; /* счетчик просматриваемых разрядов */
int j=0; /* номер двоичной цифры в строке, начиная слева */
for (i=n-1;i>=0;i--)
{
if (val & (1 << i)) /* если 1 */
{
leading_zeros=NO; /* лидирующие нули закончились */
s[j++]='1';
}
else if (!leading_zeros)
s[j++]='0';
}
if (leading_zeros)
s[j++]='0'; /* если одни нули */
s[j]='\0';
}
5
Неизвестный
22.01.2010, 19:25
общий
lamed:
"%d" - используется для ввода/вывода знаковых целых чисел.
Неизвестный
22.01.2010, 22:09
общий
это ответ
Здравствуйте, animestyle.
Этот пример написан скорее с целью поупражняться в AT&T ассемблере и его реализации в GCC.
Программа написана на C и компилировалась GCC. Используется специфический для этого компилятора синтаксис оператора asm. Соответственно, не будет компилироваться компиляторами типа VC++ и т.п.
Код:
#include <stdio.h>
#include <stdlib.h>

// Преобразует число num в бинарную строку str.
// Если str==NULL то просто возвращает требуемый размер строки.
// Иначе еще и заполняет эту строку двоичным представлением числа.

unsigned int uint2bin(unsigned int num, char* const str)
{
unsigned int count = 0;
asm(
"mov $1,%%eax;"
"mov %%edx,%%ebx;"
"l1:inc %%eax;"
"shr $1,%%ebx;"
"jnz l1;"
"test %%esi,%%esi;"
"jz exit;"
"lea -1(%%esi,%%eax),%%esi;"
"movb $0,(%%esi);"
"l2:dec %%esi;"
"mov %%edx,%%ebx;"
"and $1,%%ebx;"
"add $48,%%ebx;"
"movb %%bl,(%%esi);"
"shr $1,%%edx;"
"jnz l2;"
"exit:"
: "=a"(count)
: "d"(num), "S"(str)
: "ebx");
return count;
}

int main()
{
unsigned int num;
printf("Введите число:");
scanf("%u", &num);
char* binstr = (char*) malloc(uint2bin(num, 0));
uint2bin(num, binstr);
printf("uint2bin(%u)=%s\n", num, binstr);
free(binstr);
return EXIT_SUCCESS;
}

Пример работы:
Код:
Введите число:65536
uint2bin(65536)=10000000000000000

Введите число:10
uint2bin(10)=1010
Неизвестный
22.01.2010, 22:51
общий
Micren:
"%u" - конечно, спасибо!
Неизвестный
23.01.2010, 01:50
общий
animestyle:
Добрый вечер! В программе допущены ошибки в спецификаторах формата для scanf и printf. Должно быть
Код:
 scanf("%u", &val);

Код:
 printf("binary(%u)=%s\n", val, s);

Керниган, Ричи, B1.2.Форматный вывод; B1.3.Форматный ввод
Форма ответа