Консультация № 174377
19.11.2009, 17:01
0.00 руб.
19.11.2009, 19:21
0 13 1
Помогите пожалуйста написать программу, которая получает случайное целое типа int, выводит его двоичное представление на экран, выполняет преобразование: Если в числе встречается последовательность битов 000, заменить её на 0110 (лишние разряды сдвигать влево).
Например: 11010001 -> 10101101

Если операция предусматривает использование одного или нескольких случайных параметров (например, сдвиг на случайное число битов), их значения следует выводить на экран.

Преобразование должно осуществляться с помощью битовых операций (сдвиги, логические операции). Использование массивов для представления битов числа нежелательно.

Обсуждение

давно
Старший Модератор
31795
6196
19.11.2009, 17:32
общий
Помогите пожалуйста написать программу

Какой язык
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
19.11.2009, 18:16
общий
decstar:
А если последовательность 0000 встретиться, то как ее заменять?
Неизвестный
19.11.2009, 19:14
общий
Язык C
Неизвестный
19.11.2009, 19:15
общий
Если 0000, то заменять первые 3 нуля от начала
давно
Старший Модератор
31795
6196
19.11.2009, 19:22
общий
decstar:
Ваш вопрос перенесен, внимательно относитесь к выбору рассылок, удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
20.11.2009, 00:02
общий
Вот желательно использование вот этой функции)) - выводит число бинарно.


void print_as_binary(unsigned int num)
{
cout << "Binary representation of " << num << " is ";

unsigned int mask = 0x80000000;

for(int i = 0; i < sizeof(num)*8; ++i)
{
cout << (bool)(num & mask);

if (i%8 == 0 && i != 0) cout << " ";

mask >>= 1;
}

cout << endl;
Неизвестный
21.11.2009, 20:20
общий
неужели никто не может доделать((
давно
Посетитель
7438
7205
23.11.2009, 11:02
общий
это ответ
Здравствуйте, decstar.
Решение в приложении.
Если что непонятно, спрашивайте в мини-форуме

Приложение:
#include <iostream>
#include <time.h>
#include <stdlib.h>

using namespace std;

void print_as_binary(unsigned int num)
{
//табуляция для выравнивания
cout << "Binary representation of " << num << " is \t";

unsigned int mask = 0x80000000;

for(int i = 0; i < sizeof(num)*8; ++i)
{
cout << ((num & mask)!=0); //преобразовать в логическую 1 или 0 лучше так

if ((i&7) == 7) //а не 0!
cout << " ";

mask >>= 1;
}
cout << endl;
}

unsigned int cmp_num(unsigned int num)
{
unsigned int mask_1=0xfffffff8; //маска для бит перед вставкой
unsigned int mask_2=0x00000007; //маска проверяемых бит
unsigned int ins=0x00000006; //4 вставляемых бита
unsigned int mask_3=0x00000000; //маска для бит после вставки

//цикл проверки бит
//на 3 меньше, т.к. мы смотрим 3 сразу
//счетчик увеличиваем в теле цикла
for (int i=0; i<sizeof(num)*8-3; )
{
if ((num & mask_2) == 0) //проверим, равны ли 0 три очередные биты
{
//сформируем новое значение, как логическое "или" трех частей
num = ((num & mask_1)<<1) | ins | (num & mask_3);
//сдвинем маски и счетчик цикла на 4, чтобы пропустить вставленные биты
mask_1 <<= 4;
mask_2 <<= 4;
ins <<= 4;
mask_3 <<= 4;
mask_3 |= 0xf;
i+=4;
}
else
{
//сдвинем маски и счетчик на 1
mask_1 <<= 1;
mask_2 <<= 1;
ins <<= 1;
mask_3 <<= 1;
mask_3 |= 1;
i++;
}
}
return num;
}

int main()
{
srand( (unsigned)time( NULL ) );
unsigned int random = rand()*rand()+rand(); //просто rand() даст случайное число только до 0x7fff
print_as_binary(random);
random = cmp_num(random);
print_as_binary(random);

system("pause");
return 0;
}
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
23.11.2009, 11:20
общий
decstar:
Ну почему никто? Можем... Но...
Во-первых, есть 5 суток на ответ...
Во-вторых, Вы ничем экспертов не заинтересовали, поэтому предъявлять какие-либо претензии у Вас нет никаких прав вообще.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
17042
808
23.11.2009, 14:28
общий
Кстати, вывод целого на консоль в двоичном виде, IMHO, проще организовать посредством рекурсии, вот так как-то:

Код:

#include <stdio.h>
#include <time.h>
//-------------------------------------------------------
#define MAX_NUMBER 100
//-------------------------------------------------------
void ShowBits(int iNumber)
{
if(iNumber == 1)
{
printf("%d", iNumber);
}
else
{
ShowBits(iNumber / 2);
printf("%d", iNumber % 2);
}
}
//-------------------------------------------------------
int main()
{
srand(time(NULL));

int iNumber = rand() % MAX_NUMBER;
printf("Десятичное представление числа: %d\n", iNumber);
printf("Двоичное представление числа: ");
ShowBits(iNumber);
printf("\n");
return 0;
}
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Посетитель
7438
7205
23.11.2009, 14:34
общий
Dr_Andrew:
А пробелы между байтами ?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
17042
808
23.11.2009, 14:54
общий
Лысков Игорь Витальевич:
Ну... нету...
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Неизвестный
23.11.2009, 16:39
общий
Нет конечно претензий никаких нет, просто на другие вопросы по-быстрее отвечали.
Спасибо большое за ответ, токо надо быдл чтоб пользователь сам вводил число, ну это я сам переделаю! Всё понял, осталось токо блок-схему написать)).

Ещё раз спасибо).
Форма ответа