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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2012, 00:03   #1
ktulhobraz
 
Регистрация: 07.11.2012
Сообщений: 6
Вопрос Господа, оцените код

Собственно, накодил программку, которая циклически сдвигает младшую тетраду на число, хранящееся в двух старших битах старшей тетрады. Программка вроде бы работает, хотелось бы узнать как и где можно сделать лучше код.
Сильно в дебри не лез, ибо новичок в Си и в Си++, суть алгоритма в том, что младшая тетрада "вычленяется" из байта, сдвигается на число, на которое его нужно сдвинуть, затем делится на тетрады и они складываются. И так для каждого байта числа (по дефолту формат unsigned int). Как то так в общем, кодил в Visual Studio 2010:
Код:
#include "stdafx.h"
#include "iostream"
#include "conio.h"
#include "locale.h"
using namespace std;
unsigned int number,shift_number=0;

void binprint (unsigned int num)                            //Вывод чисел в двоичном виде
  { 
	for (int i = sizeof(num)*8-1; i>=0; i--)
	{
		cout<< (num >> i & 1);
		if (i % 8 == 0)
		{
		cout << ' ';
		}
	}
	cout<< endl;
  }

int shift(int sh_num, int mask, int j)                      //Функция сдвига младшей тетрады
  {
	int num=sh_num&mask;
	num>>=j*8;                                              //Перенос байта на 4 позицию для вычислений
	int offset = num >> 6;                                  //Старшие биты старшей тетрады
	int first = num & 0xF0;                                 //Старшая тетрада
	int second = num & 0x0F;                                //Младшая тетрада
	second<<=offset;
	int half_1=second&0xF0;                                 //Разделение младшей тетрады на две части для сдвига
	int half_2=second&0x0F;
	half_1>>=4;                                             //"Сборка" циклически сдвинутой младшей тетрады
	second=half_1+half_2;
	sh_num=first+second;
	sh_num<<=j*8;
	return sh_num;
  }
int main(void)
{
	setlocale(LC_ALL, "Russian");
	int mask=0x000000ff;                                    //Маска для определения байтов числа
	cout << "Введите число: ";
	cin >> number;
	cout << "Ваше число: ";
	binprint(number);
	for (int i=0; i<=sizeof(number); i++)                   //Вычисления для каждого байта числа
	{
	  shift_number+=shift(number, mask, i);
	  mask<<=0x8;
	}
	cout << "Результат:   "<< endl;
	cout << "bin:        ";
	binprint(shift_number);
	cout << dec << "dec:        " << shift_number << endl;
	cout << "Для выхода нажмите Enter";
	getch();
}
ktulhobraz вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Господа Gtnz8 Операционные системы общие вопросы 2 28.10.2012 16:17
Господа программисты...... dgalanov Свободное общение 3 08.08.2009 18:24
Господа можете прокоментировать код. hub2002 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 07.08.2009 02:03
Господа програмеры. BangBangFM Работа с сетью в Delphi 17 14.08.2008 16:56
господа выручайте!! Stan Помощь студентам 2 25.06.2007 19:38