Отчет Лаба2
.docСанкт-Петербургский государственный
электротехнический университет
Отчет по лабораторной работе № 2
Преподаватель
Студенты гр
2011
#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
int main()
{
int val, res = 0, tmp, rank, i, i1, i2, i3, mask;
char strbuf[256];
char** endp = NULL; //обнуляем
printf("Enter value: ");
fgets(strbuf, sizeof(strbuf), stdin); //читает (количество strbuf) из stdin символы и помещяет их в указатель strbuf
val = strtoul(strbuf,endp,0); //вводим число и заносим его в val
cout<<"BIN: ";
for (i = 31; i >= 0; i--)
if ((val&(1<<i))==0) cout<<0; // печатаем исходное число в BIN виде
else cout<<1;
printf("\nEnter rank: ");
fgets(strbuf, sizeof(strbuf), stdin);
rank = strtoul(strbuf,endp,0);
printf("Enter index 1: ");
fgets(strbuf, sizeof(strbuf), stdin);
i1 = strtoul(strbuf,endp,0);
printf("Enter index 2: ");
fgets(strbuf, sizeof(strbuf), stdin);
i2 = strtoul(strbuf,endp,0);
if (rank < 0 || i1 < 1 || i2 < 1 //проверка на ошибку ввода данных - перекрестные блоки
|| i1 > i2 || (i1 + rank) > i2) {
fprintf(stderr,"Invalid argument(s)\n");
return -1;
}
i1--;
i2--;
//копирование group 1
tmp = val >> i1;
mask = (1 << rank) - 1;
res |= ((tmp & mask) << i2);
// копирование между group 1 и group 2
tmp = val >> (i1 + rank);
mask = (1 << (i2 - rank - i1)) - 1;
res |= ((tmp & mask) << (i1 + rank));
// копирование group 2
tmp = val >> i2;
mask = (1 << rank) - 1;
res |= (tmp & mask) << i1;
// копирование rest после group 2
mask = (1 << (i2 + rank)) - 1;
res |= (val & ~mask);
// копирование rest перед group 1
mask = (1 << i1) - 1;
res |= (val & mask);
printf("\nResult:\nBIN: ");
for (i3 = 31; i3 >= 0; i3--)
if ((res&(1<<i3))==0) cout<<0; // печатаем результат в BIN виде
else cout<<1;
printf("\nDEC: %d\n", res); // вывод на экран в DEC
// system("pause");
// getch();
return 0;
}