Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2012, 13:29   #1
Вечный_студент
Пользователь
 
Аватар для Вечный_студент
 
Регистрация: 11.11.2011
Сообщений: 45
Сообщение замена битов в числе

Всем доброго дня!
Вот небольшая программа. Она должна находить в числе последовательность бит '000' и заменять на '0110'. На числах до 256 (8 бит) она работала прекрасно, а вот когда я взял числа на 4 байта начала считать неправильно.подскажите в чем ошибка?

Код:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

main()
{
	int a,i;
	srand(time(NULL));

	a=rand()%2147483647;
	printf("a = %d\n",a);
	
        for (i=31; i>=0; i--)
		printf("%d",(a>>i)&1);

	i=0; 
	printf("\n");
	while (i<32)
	{
		if ((a&7)==0)
		{
                      a|=(6<<i);
                      i+=4; 
                      a>>=3;
                }
		else
		{
                       a|=((a&1)<<i);
                       a>>=1;
                       ++i;
                 }

	}
	a &= 0xFFFFFFF;
	printf("\nresult=%d\n",a);

	for (i=31; i>=0;i--)
		printf("%d",((a>>i)&1));
	printf("\n\n");
	return 0;
}
Крепкая стена строится из маленьких кирпичей.
Но если положил первый кирпич криво, как ни старайся, стена кривой будет.

Последний раз редактировалось Вечный_студент; 02.05.2012 в 16:08.
Вечный_студент вне форума Ответить с цитированием
Старый 02.05.2012, 18:14   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
последовательность бит '000' и заменять на '0110'
Ниче что кол-во бит разное?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.05.2012, 21:37   #3
Вечный_студент
Пользователь
 
Аватар для Вечный_студент
 
Регистрация: 11.11.2011
Сообщений: 45
По умолчанию

так задумано. лишние биты влево задвигаются

a &= 0xFFFFFFF;
вот эта маска отрезает лишние биты. хотя они и так за разрядную сетку выходят. но это для наглядности
Крепкая стена строится из маленьких кирпичей.
Но если положил первый кирпич криво, как ни старайся, стена кривой будет.

Последний раз редактировалось Stilet; 02.05.2012 в 23:20.
Вечный_студент вне форума Ответить с цитированием
Старый 03.05.2012, 21:16   #4
Indian
Форумчанин
 
Регистрация: 23.02.2010
Сообщений: 107
По умолчанию

Код:
	i=0;
	int b = 0;
	printf("\n");
	while (i<32)
	{
		if ((a&7)==0)
		{
                      b|=(6<<i);
                      i+=4; 
                      a>>=3;
                }
		else
		{
                       b|=((a&1)<<i);
                       a>>=1;
                       ++i;
                 }

	}

Последний раз редактировалось Indian; 03.05.2012 в 23:06.
Indian вне форума Ответить с цитированием
Старый 04.05.2012, 08:05   #5
Вечный_студент
Пользователь
 
Аватар для Вечный_студент
 
Регистрация: 11.11.2011
Сообщений: 45
По умолчанию

Цитата:
Сообщение от Indian Посмотреть сообщение
Код:
	i=0;
	int b = 0;
	printf("\n");
	while (i<32)
	{
		if ((a&7)==0)
		{
                      b|=(6<<i);
                      i+=4; 
                      a>>=3;
                }
		else
		{
                       b|=((a&1)<<i);
                       a>>=1;
                       ++i;
                 }

	}
изначально был такой вариант, с доп. переменной, но я отказался от него. Дело в том, что после первого прогона программы у некоторых чисел остаются последовательности битов '000'. То есть сверху этого цикла нужен еще один цикл на проверку. С доп переменной не получится ввести такого.

и еще одна проблема: как видно на скрине, у числа остается не тронутым старших 3 бита.
Изображения
Тип файла: jpg 123.jpg (18.1 Кб, 66 просмотров)
Крепкая стена строится из маленьких кирпичей.
Но если положил первый кирпич криво, как ни старайся, стена кривой будет.
Вечный_студент вне форума Ответить с цитированием
Старый 04.05.2012, 08:32   #6
Indian
Форумчанин
 
Регистрация: 23.02.2010
Сообщений: 107
По умолчанию

Код:
a = 1
00000000000000000000000000000001

result=-858993459
11001100110011001100110011001101
Если не заменять a &= 0xFFFFFFF; на b &= 0xFFFFFFF;.

Но похоже есть ошибка:
Код:
a = 375245393
00010110010111011100101001010001

result=-1396992851
10101100101110111001010010101101
Старшие два бита, если они равны 0, трактуются как совпавшие по шаблону (00==000), притом то же самое и с одним битом, т.е. ((a>>31)&7)==0.

Последний раз редактировалось Indian; 04.05.2012 в 10:22.
Indian вне форума Ответить с цитированием
Старый 04.05.2012, 16:44   #7
Вечный_студент
Пользователь
 
Аватар для Вечный_студент
 
Регистрация: 11.11.2011
Сообщений: 45
По умолчанию

Цитата:
Сообщение от Indian Посмотреть сообщение
Код:

Но похоже есть ошибка:
a = 375245393
00010110010111011100101001010001

result=-1396992851
10101100101110111001010010101101
крайний левый бит в числе - это знак числа. (1-отриц. 0-полож) так что само число правильно.
так там три 000 же изначально. вот он их и поменял


лучше без этой строчки.
Код:
b &= 0xFFFFFFF;
хм... а почему у нас цифры разные....
Код:
0000 0010 0100 0001 1000 0001 0100 0001(исходник)
1010 0100 0110 1101 1001 1010 1000 1101(как должно быть после первого прогона)
1110 1100 1110 1101 1101 1110 1100 1101(у меня)
1010 1100 1011 1011 1001 0100 1010 1101(у вас)
Изображения
Тип файла: jpg 123.jpg (16.5 Кб, 75 просмотров)
Крепкая стена строится из маленьких кирпичей.
Но если положил первый кирпич криво, как ни старайся, стена кривой будет.

Последний раз редактировалось Stilet; 04.05.2012 в 19:35.
Вечный_студент вне форума Ответить с цитированием
Старый 05.05.2012, 23:35   #8
Вечный_студент
Пользователь
 
Аватар для Вечный_студент
 
Регистрация: 11.11.2011
Сообщений: 45
По умолчанию

идеи для этой программы у меня иссякли......
есть что-нибудь у кого-нибудь?(
Крепкая стена строится из маленьких кирпичей.
Но если положил первый кирпич криво, как ни старайся, стена кривой будет.
Вечный_студент вне форума Ответить с цитированием
Старый 06.05.2012, 23:04   #9
Вечный_студент
Пользователь
 
Аватар для Вечный_студент
 
Регистрация: 11.11.2011
Сообщений: 45
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

main()
{
	int a,i,b;
	srand(time(NULL));

	a=2147483640;
	printf("a = %d\n",a);
	for (i=31; i>=0; i--)
		printf("%d",(a>>i)&1);

	i=0; 
	printf("\n");
	while (i<32)&(((b<<i)|0x7)==0))
	{
		if ((a&7)==0)
		{
                      b|=(6<<i);
                      i+=4; 
                      a>>=3;
                }
		else
		{
                       b|=((a&1)<<i);
                       a>>=1;
                       ++i;
                 }

	}
	printf("\nresult=%d\n",b);
	for (i=31; i>=0;i--)
		printf("%d",((b>>i)&1));
	printf("\n\n");
	return 0;
}
не хочет она правильно работать хоть убей её
Крепкая стена строится из маленьких кирпичей.
Но если положил первый кирпич криво, как ни старайся, стена кривой будет.
Вечный_студент вне форума Ответить с цитированием
Старый 07.05.2012, 15:26   #10
Indian
Форумчанин
 
Регистрация: 23.02.2010
Сообщений: 107
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

main()
{
	int a,i,b;
	srand(time(NULL));

	a=2147483640;
	printf("a = %d\n",a);
	for (i=31; i>=0; i--)
		printf("%d",(a>>i)&1);

	i=0; 
	printf("\n");
	while (i<32)
	{
		if ((a&7)==0)
		{
                      b|=(6<<i);
                      i+=4; 
                      a>>=3;
                }
		else
		{
                       b|=((a&1)<<i);
                       a>>=1;
                       ++i;
                 }

	}
	printf("\nresult=%d\n",b);
	for (i=31; i>=0;i--)
		printf("%d",((b>>i)&1));
	printf("\n\n");
	return 0;
}
В while (i<32)&(((b<<i)|0x7)==0)) вторая часть непонятно зачем.

Попробовал подставить числа на место a:
Код:
a = 2147483640
01111111111111111111111111111000

result=-10
11111111111111111111111111110110
Код:
a = 375245393
00010110010111011100101001010001

result=-322985987
11101100101111111001111111111101
Последнее очень странно.
Притом, что уже запускал код(с доп. переменной) - результаты были другие:
Код:
a = 375245393
00010110010111011100101001010001

result=-1396992851
10101100101110111001010010101101
Код:
a = 2147483640
01111111111111111111111111111000

result=-10
11111111111111111111111111110110
Насчет разных цифр:
Код:
a = 37847361
00000010010000011000000101000001

result=-1536320883
10100100011011011001101010001101
Т.е. как и должно быть, не учитывая старшие два бита.
Похоже, вы забыли обнулить b.
Indian вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подсчет битов mercure243 Общие вопросы C/C++ 1 12.03.2012 03:56
Вставка битов Aleks2215 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 09.12.2010 20:32
Перемешивание позиций битов в числе explored Общие вопросы C/C++ 6 27.10.2010 23:14
Замена второго бита в числе SZR Помощь студентам 4 25.01.2008 20:16
Перестановка битов. RegentM Общие вопросы Delphi 3 05.11.2007 17:23