Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: байты  (Прочитано 21231 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ФФФ
Гость
« : 20-11-2005 12:03 » 

такое задание
в кадом байте длинного целого числа N поменять двоичные разряды в зеркальном порядке


Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void main(void)
{
char  buffer[100];
int   N;
int   i,tmp;

i=0;
clrscr();
printf("Vvedute chuslo:\n\n");
scanf("%d",&N);
itoa(N,buffer,2);
printf("Dvouchnoe predstavlenue chusla:%s\n\n",buffer);
tmp=0;
printf("v zerkalnom poriadke");
while (buffer[i]!='\0')
{
 tmp++;
 i++;
}
for (i=tmp;i>=0;i--)

{

printf("%c",buffer[i]);
}

printf("\n");

}

 скажите то ли я сделала,или я че то не догнала=) если не так подскажите как

Finch :flowers:
« Последнее редактирование: 18-12-2007 21:42 от Алексей1153++ » Записан
nikedeforest
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 20-11-2005 13:32 » 

Как сказать. Ты переворачиваешь число полностью, но тебе, судя по заданию, надо перевернуть каждый байт числа. Все хорошо, если будет введено число <=255, т.к. это 1 байт. Если же ввести 300, то это уже 2 байта.
Для числа 300 рассмотрим пример:
двоичное представление: 100101100 , т.е. 2 байта |00000001|00101100|
зеркальное отражеие твоей проги: 001101001
как должно быть, судя по заданию:  |10000000|00110100|
Т.е. тебе надо брать на рассмотрение в отдельности каждый байт числа.
Для этого, очень удобно использовать указатели. Возьми указатель типа char (он как раз в 1 байт), присвой ему адрес переменной в которой будет твое число. Таким образом можешь рассмотреть один байт. Потом смести указатель на единицу и рассмотришь следующий байт и т.д., пока не рассмотришь столько байт, скоько тебе необходимо.
Записан

ещё один вопрос ...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 20-11-2005 15:27 » 

Мда не читаю я внимательно задание Улыбаюсь
Вот исправленное решение:
Код:
#include <stdio.h>

void PrintBit(unsigned int a)
{

int len = sizeof(int)*8;       
unsigned int fl=1 << (len-1);
while (len>0)
{
if ((len % 4) == 0) printf(" ");
if ((a & fl) != 0) printf("1");
else printf("0");
len--;
fl >>=1;
}
printf("\n");
}

int main()
{

unsigned int a;
        printf("Vvedite chislo: ");
        scanf("%d",&a);
unsigned int b=0;
unsigned int temp=a;
int len = sizeof(int);       
unsigned char *ta=(unsigned char *)&temp;
unsigned char *tb=(unsigned char *)&b;
int i;

while (len>0)
{
i=8;
while (i>0)
{
(*tb) <<=1;
(*tb)+=((*ta) & 1);
(*ta) >>=1;
i--;
}
len--;
ta++;
tb++;
}
printf("Dvouchnoe predstavlenue chisla:\n");
printf("Do:    ");
PrintBit(a);
printf("Posle: ");
PrintBit(b);
return 0;
}
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
ФФФ
Гость
« Ответ #3 : 21-11-2005 06:04 » 

Nickdeforest thnxX
Finch спасиб но
ну так же прога не будет работать?
Код:
#include <stdio.h>

void PrintBit(unsigned int a)
{

int len = sizeof(int)*8;       
unsigned int fl=1 << (len-1);
while (len>0)
{
if ((len % 4) == 0) printf(" ");
if ((a & fl) != 0) printf("1");
else printf("0");
len--;
fl >>=1;
}
printf("\n");
}

int main()
{

unsigned int a;
   
unsigned int b=0;
unsigned int temp=a;
int len = sizeof(int);       
unsigned char *ta=(unsigned char *)&temp;
unsigned char *tb=(unsigned char *)&b;
int i;
     printf("Vvedite chislo: ");
        scanf("%d",&a);
while (len>0)
{
i=8;
while (i>0)
{
(*tb) <<=1;
(*tb)+=((*ta) & 1);
(*ta) >>=1;
i--;
}
len--;
ta++;
tb++;
}
printf("Dvouchnoe predstavlenue chisla:\n");
printf("Do:    ");
PrintBit(a);
printf("Posle: ");
PrintBit(b);
return 0;
}

двоичное представление то правильно,
но вот зеркалка,ваще что то странное выводит?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 21-11-2005 16:34 » 

Цитата
в кадом байте длинного целого числа N поменять двоичные разряды в зеркальном порядке
Тип int для 32 разрядных систем состоит из 4 байт. В твоем задании просят перевернуть именно каждый байт. Что программа и делает. В первоначальном варианте проги переворачивалось все число разом.
Пример :
Цитата
Vvedute chuslo: 123654789
Dvouchnoe predstavlenue chisla:
Do:     0000 0111 0101 1110 1101 0010 1000 0101
Posle:  1110 0000 0111 1010 0100 1011 1010 0001
Press any key to continue
Байт состояит из 8 битов.
1 байт 0000 0111 его зеркало 1110 0000
2 байт 0101 1110 его зеркало 0111 1010
3 байт 1101 0010 его зеркало 0100 1011
4 байт 1000 0101 его зеркало 1010 0001

Записан

Не будите спашяго дракона.
             Джаффар (Коша)
ФФФ
Гость
« Ответ #5 : 22-11-2005 05:48 » 

Финч
извини конечно что достаю
но!

Vvedute chuslo: 123654789
Dvouchnoe predstavlenue chisla:

DO       1101 0010 1000 0101
POSLE  0100 0000 0001 1000

вот этот код

Код:
#include <stdio.h>

void PrintBit(unsigned int a)
{

int len = sizeof(int)*8;       
unsigned int fl=1 << (len-1);
while (len>0)
{
if ((len % 4) == 0) printf(" ");
if ((a & fl) != 0) printf("1");
else printf("0");
len--;
fl >>=1;
}
printf("\n");
}

int main()
{

unsigned int a;

unsigned int b=0;
unsigned int temp=a;
int len = sizeof(int);       
unsigned char *ta=(unsigned char *)&temp;
unsigned char *tb=(unsigned char *)&b;
int i;
printf("Vvedite chislo: ");
scanf("%d",&a);
while (len>0)
{
i=8;
while (i>0)
{
(*tb) <<=1;
(*tb)+=((*ta) & 1);
(*ta) >>=1;
i--;
}
len--;
ta++;
tb++;
}
printf("Dvouchnoe predstavlenue chisla:\n");
printf("Do:    ");
PrintBit(a);
printf("Posle: ");
PrintBit(b);
return 0;
}

скажи ошибка может где?
Записан
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 22-11-2005 07:47 » 

Ошибка в том, что scan для переменной a вызывается после того, как значение переменной a копируется в переменную temp:
Код:
unsigned int a;

unsigned int b=0;
unsigned int temp=a;
...
printf("Vvedite chislo: ");
scanf("%d",&a);                      // <== ошибка
...

скажи ошибка может где?

А должно быть так:
Код:
unsigned int a;

printf("Vvedite chislo: "); 
scanf("%d",&a);                 // <== вот сюда

unsigned int b=0;
unsigned int temp=a;
...
Записан
ФФФ
Гость
« Ответ #7 : 22-11-2005 09:20 » 

так если так ошибка постоянно

declaration si now allowed here=((((((((((((((((((((((((((((((((((((((((((((((((((((((((
Записан
nikedeforest
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 22-11-2005 09:40 » 

Альтернативный вариант. Вроде протестил, нормально работает. Предоставляется выбор Улыбаюсь
Код:
#include "stdio.h"
#include "conio.h"
int main()
{
clrscr();
unsigned int x=0;
unsigned int res_x=0;
unsigned int temp=0;

    printf("Input unsigned digit ");
    scanf("%d",&x);
    res_x=x;
//////////////////////////////////////////////////////////
    printf("binary :");
    for(int i=0;i<sizeof(res_x)*8;i++)
    {
     temp=res_x;
   res_x<<=1;
   res_x>>=1;
  if(res_x==temp)
  printf("0");
  else
  printf("1");

  if((i+1)%8==0)
  printf("|");

  res_x<<=1;
    }
///////////////////////////////////////////////////////
    res_x=x;
    printf("\nzerkalo:");
      for(int j=sizeof(res_x);j>0;j--)
      {
   res_x=x;
   res_x>>=8*(j-1);

for(i=0;i<8;i++)
{
      temp=res_x;
   res_x>>=1;
   res_x<<=1;
  if(res_x==temp)
  printf("0");
  else
  printf("1");

   if((i+1)%8==0)
   printf("|");

  res_x>>=1;
}
       }

return 1;
}
Записан

ещё один вопрос ...
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 22-11-2005 10:02 » 

так если так ошибка постоянно

declaration si now allowed here=((((((((((((((((((((((((((((((((((((((((((((((((((((((((
Это что, сообщение об ошибке?
Ты пробовала просто скопировать текст программы Finch'а из его первого поста и попытаться откомпилировать?
« Последнее редактирование: 18-12-2007 21:45 от Алексей1153++ » Записан
ФФФ
Гость
« Ответ #10 : 22-11-2005 10:23 » 

hooter
конечно
да эту ошибку дает

nikdeforest
спасиб!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Записан
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 22-11-2005 10:48 » 

hooter
конечно
да эту ошибку дает
А ты не могла бы полностью привести текст сообщения компилятора?
И номер строки, где возникает ошибка?
Записан
nikedeforest
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 22-11-2005 10:56 » 

Кстати, правильность ответа не проверял, а вот то, что код Finch'a компилится - это 100%.
ФФФ, выделяй код программы, что Finch написал. Копируй (ctrl+insert), открывай текстовый файл (в блокноте)
и вставляй в него код программы (shift+insert) и сохраняй. Все будет ОК.
« Последнее редактирование: 18-12-2007 21:47 от Алексей1153++ » Записан

ещё один вопрос ...
ФФФ
Гость
« Ответ #13 : 22-11-2005 11:03 » 

Nike так и сделала

вот код мой,копия ФИнча
Код:
#include <stdio.h>
void PrintBit(unsigned int a)
{

int len = sizeof(int)*8;       
unsigned int fl=1 << (len-1);
while (len>0)
{
if ((len % 4) == 0) printf(" ");
if ((a & fl) != 0) printf("1");
else printf("0");
len--;
fl >>=1;
}
printf("\n");
}

int main()
{

unsigned int a;
        printf("Vvedite chislo: ");
        scanf("%d",&a);
unsigned int b=0;
unsigned int temp=a;
int len = sizeof(int);       
unsigned char *ta=(unsigned char *)&temp;
unsigned char *tb=(unsigned char *)&b;
int i;

while (len>0)
{
i=8;
while (i>0)
{
(*tb) <<=1;
(*tb)+=((*ta) & 1);
(*ta) >>=1;
i--;
}
len--;
ta++;
tb++;
}
printf("Dvouchnoe predstavlenue chisla:\n");
printf("Do:    ");
PrintBit(a);
printf("Posle: ");
PrintBit(b);
return 0;
}

ошибка в 24 строке
Declaration is not allowed here
Записан
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 22-11-2005 11:20 » 

Вот этот кусок
Код:
unsigned int a;
 printf("Vvedite chislo: ");
 scanf("%d",&a);
unsigned int b=0;
unsigned int temp=a;
int len = sizeof(int);
unsigned char *ta=(unsigned char *)&temp;
unsigned char *tb=(unsigned char *)&b;
int i;

while (len>0)
{


попробуй заменить вот этим:
Код:
unsigned int a;
unsigned int b=0;
unsigned int temp;
int len = sizeof(int);
unsigned char *ta=(unsigned char *)&temp;
unsigned char *tb=(unsigned char *)&b;
int i;

 printf("Vvedite chislo: ");
 scanf("%d",&a);
 temp=a;

while (len>0)
{


ЗЫ. Интересно, что код компилируется и под MSVC++ и под gcc.
Что за компилятор ты используешь?
Записан
nikedeforest
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 22-11-2005 11:20 » 

Ты не поверишь, но у меня скомпилился код (вставлял твой, котрый ты даешь в последнем посте).
А мой скомпилился? Если нет, то наверное дело в компилятрое. Ты в чем работаешь?
Записан

ещё один вопрос ...
ФФФ
Гость
« Ответ #16 : 22-11-2005 11:23 » 

у меня Borland C
3.1

твой компилится
=))
Записан
nikedeforest
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 22-11-2005 12:34 » new

Я пробовал на Turbo C++ 3.0 все было ОК.
Насколько я знаю Turbo C++ и Borland C++ - это те же яйца только в профиль Улыбаюсь.
Записан

ещё один вопрос ...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines