close

Вход

Забыли?

вход по аккаунту

?

SP.LW1.GLK

код для вставкиСкачать
#include
<iostream>
/*объявляет объекты cin, cout, cerr, clog, которые
соответствуют стандартным потокам ввода и вывода, небуферизованному и
буферизованному стандартным потокам вывода сообщений об ошибках.*/
#include
<iomanip>
/*содержит информацию, используемую для
обработки форматированного ввода-вывода при помощи так называемых
параметризованных манипуляторов потока.*/
#include
<windows.h>
#include
<time.h>
using
namespace
std;
#ifndef
_INC_MY_RUS_
#define
_INC_MY_RUS_ // Функция меняет кодировку ANSI в OEM
char
* Rus(
char
* in, char
* out)
{
if
(CharToOemA(in, out)) return
out;
else
return
0;
}
char
s[100];
#endif
union
Date
{
unsigned
int
month
:4; // Битовые поля позволяют рационально использовать
unsigned
int
date
:5; // память с помощью хранения данных в минимально unsigned
int
hours
:5; // требуемом количестве битов.
unsigned
int
minutes :6; // :n - задаёт ширину поля (число битов, в которых хранится
unsigned
int
seconds :6; // этот
элемент
)
} newDate;
struct
Byte
{
unsigned
int
B :8;
} newByte;
double
difftime(time_t time2, time_t time1);
void
BinaryForm(
unsigned
int
, unsigned
int
); unsigned
int
CyclicShift(
unsigned
int
, unsigned
int
);
unsigned
int
PackingDate();
unsigned
int
PackingDateBF();
void
UnpackingDate(
unsigned
int
);
int
CreateMas(
int
);
int
CountBits1(
int
);
int
CountBits2(
int
, int
*);
int
Pow(
int
, int
);
const
unsigned
int
mask_val = 31;
time_t start1, finish1, start2, finish2;
void
main()
{
/*Напишите и продемонстрируйте работу программы, выводящей на экран в
двоичной форме целое число типа int . Для получения значений битов числа
использовать только побитовые операции.*/
cout << Rus(
"
1. Вывод на экран значения целого числа в двоичной форме"
,s) << endl << endl;
unsigned
int
x;
cout << Rus(
"
Введите
десятичное
число
> "
,s);
cin >> x;
cout << endl;
cout << Rus(
"
Двоичная
форма
= "
,s);
BinaryForm(x, mask_val);
cout << endl << endl << endl << endl << endl;
//-----------------------------------------------------------------
/*2.
Создать функцию, которая перемещает биты для unsigned int на заданное кол-во бит вправо, выходящие при сдвиге за правую границу переменной биты должны «вталкиваться» в переменную слева.*/
cout << Rus(
"
2. Циклический сдвиг битов"
,s) << endl << endl;
unsigned
int
shift_val;
cout << Rus(
"
Введите
десятичное
число
> "
,s);
cin >> x;
cout << Rus(
"
Бинарная
форма
= "
,s);
BinaryForm(x, mask_val);
cout << endl << endl;
cout << Rus(
"Введите значение сдвига > "
,s);
cin >> shift_val;
shift_val %= mask_val;
cout << endl;
cout << Rus(
"
Результат
= "
,s);
BinaryForm(CyclicShift(x, shift_val), mask_val);
cout << endl << endl << endl << endl << endl;
//-----------------------------------------------------------------
/*3.1
Написать функцию, которая принимает 5 целых чисел соответствующих моменту времени: месяц, число, час, минута, секунда и возвращает переменную типа unsigned int. Использовать побитовые операции*/
cout << Rus(
"
3.1 Упаковка даты"
,s) << endl << endl;
unsigned
int
p_date;
p_date = PackingDate();
BinaryForm(p_date,25);
cout << endl << endl << endl << endl << endl;
//-----------------------------------------------------------------
/*3.2
Написать функцию, в которой для упаковки даты используется механизм структур с битовыми полями и встроенный тип языка С++ union.*/
cout << Rus(
"
3.2Упаковка даты при помощи механизма структур с битовыми полями"
,s) << endl
<< endl;
BinaryForm(PackingDateBF(),25);
cout << endl << endl << endl << endl << endl;
//-----------------------------------------------------------------
/*3.3
Написать функцию, которая принимает полученное в 3.1 или 3.2 число и выводит распакованное время.*/
cout << Rus(
"
3.3 Распаковка
даты
"
,s) << endl << endl;
UnpackingDate(p_date);
cout << endl << endl << endl << endl << endl;
//-----------------------------------------------------------------
/*4.Подсчитать число битов равных 0, 2-мя способами: Используя шаблон с одним битом равным 1. */
cout << Rus(
"
4.1 Подсчет числа значащих битов (Используя шаблон)"
,s) << endl << endl;
int
N;
cout << Rus(
"
Введите
число
> "
,s);
cin >> N;
cout << endl << Rus(
"
Двоичная
форма
> "
,s);
BinaryForm(N, mask_val);
cout << endl << endl << Rus(
"Bits = 0 > "
,s) << (32 - CountBits1(N));
cout << endl << endl << endl << endl << endl;
//-----------------------------------------------------------------
/*Используя таблицу содержащую кол-во битов равных 1 для соответствующего индекса массива.*/
cout << Rus(
"
4.2 Подсчет числа значащих битов (используя таблицу) ]"
,s) << endl << endl;
int
mas[256], i;
for
(i = 0; i < 256; i++)
mas[i] = CreateMas(i);
cout << Rus(
"
Введите
число
> "
,s) << N << endl << endl;
cout << Rus(
"
Двоичная
форма
> "
,s);
BinaryForm(N, mask_val);
cout << endl << endl << Rus(
"
Бит
= 0 > "
,s) << (32 - CountBits2(N,&mas[0]))<< endl << endl;
}
void
BinaryForm (
unsigned
int
dec, unsigned
int
mask_v)
//
Переводит
значения
в
двоичную
форму
{
unsigned
int
i, Mask = 1 << mask_v;
for
(i = 0; i <= mask_v; i++)
{
if
(Mask & dec)
cout << "1"
;
else
cout << "0"
;
Mask >>= 1;
if
((i+1) % 8 == 0)
cout << " "
;
}
}
unsigned
int
CyclicShift(
unsigned
int
x, unsigned
int
shift_val)
{
unsigned
int
i, Mask = 1 << mask_val;
for
(i=0; i<shift_val; i++)
{
if
(x & 1)
{
x >>= 1;
x |= Mask;
}
else
x >>= 1;
}
return
x;
}
unsigned
int
PackingDate()
{
unsigned
int
mon, dat, hh, mm, ss, res;
cout.setf(ios::left, ios::adjustfield);
cout << setw(18) << Rus(
"
Введите
месяц
> "
,s);
cin >> mon;
cout << setw(18) << Rus(
"
Введите
число
> "
,s);
cin >> dat;
cout << setw(18) << Rus(
"
Введите
часы
> "
,s);
cin >> hh;
cout << setw(18) << Rus(
"
Введите
минуты
> "
,s);
cin >> mm;
cout << setw(18) << Rus(
"
Введите
секунды
> "
,s);
cin >> ss;
cout << endl << endl;
cout << setw(15) << Rus(
"
Месяц
> "
,s);
BinaryForm(mon,3);
cout << endl;
cout << setw(15) << Rus(
"
Число
> "
,s);
BinaryForm(dat,4);
cout << endl;
cout << setw(15) << Rus(
"
Часы
> "
,s);
BinaryForm(hh,4);
cout << endl;
cout << setw(15) << Rus(
"
Минуты
> "
,s);
BinaryForm(mm,5);
cout << endl;
cout << setw(15) << Rus(
"
Секунды
> "
,s);
BinaryForm(ss,5);
cout << endl << endl;
ss <<= 20;
mm <<= 14;
hh <<= 9;
dat <<= 4;
res = (mon | dat | hh | mm | ss);
cout << Rus(
"Упакованая дата > "
,s);
return
res;
}
unsigned
int
PackingDateBF() {
unsigned
int
x, res = 0;
cout.setf(ios::left, ios::adjustfield);
cout << setw(18) << Rus(
"
Введите
месяц
> "
,s);
cin >> x;
newDate.month = x;
cout << "bin > "
;
BinaryForm(newDate.month, 3);
cout << "\n\n"
;
res ^= newDate.month;
res <<= 5;
cout << setw(18) << Rus(
"
Введите
дату
> "
,s);
cin >> x;
newDate.date = x;
cout << "bin > "
;
BinaryForm(newDate.date, 4);
cout << "\n\n"
;
res ^= newDate.date;
res <<= 5;
cout << setw(18) << Rus(
"
Введите
часы
> "
,s);
cin >> x;
newDate.hours = x;
cout << "bin > "
;
BinaryForm(newDate.hours, 4);
cout << "\n\n"
;
res ^= newDate.hours;
res <<= 6;
cout << setw(18) << Rus(
"
Введите
минуты
> "
,s);
cin >> x;
newDate.minutes = x;
cout << "bin > "
;
BinaryForm(newDate.minutes, 5);
cout << "\n\n"
;
res ^= newDate.minutes;
res <<= 6;
cout << setw(18) << Rus(
"
Введите
секунды
> "
,s);
cin >> x;
newDate.seconds = x;
cout << "bin > "
;
BinaryForm(newDate.seconds, 5);
res ^= newDate.seconds;
cout << endl << endl << endl;
cout << Rus(
"Упакованная дата > "
,s);
return
res;
}
void
UnpackingDate(
unsigned
int
date)
{
int
i, c = 0, Mask = 1, p = 0;
for
(i=0; i<26; i++)
{
if
(date & Mask)
c += Pow(2,p);
Mask <<= 1;
p++;
cout.setf(ios::left, ios::adjustfield);
switch
(i)
{
case
3:
cout << setw(12) << Rus(
"
Месяц
> "
,s) << c << endl;
c = 0;
p = 0;
break
;
case
8:
cout << setw(12) << Rus(
"
Дата
> "
,s) << c << endl;
c = 0;
p = 0;
break
;
case
13:
cout << setw(12) << Rus(
"
Часы
> "
,s) << c << endl;
c = 0;
p = 0;
break
;
case
19:
cout << setw(12) << Rus(
"
Минуты
> "
,s) << c << endl;
c = 0;
p = 0;
break
;
case
25:
cout << setw(12) << Rus(
"
Секунды
> "
,s) << c << endl;
c = 0;
p = 0;
}
}
}
int
CountBits1 (
int
x) //counts bits = 1
{
unsigned
int
Mask;
int
i, j, c;
time(&start1);
for
(j = 0; j < 100000000; j++)
{
Mask = 1;
c = 0;
for
(i = 0; i <= 31; i++)
{
if
(Mask & x)
c++;
Mask <<= 1;
}
}
time(&finish1);
printf(
"\n\nTimer > %f\n"
,difftime(start1, finish1));
return
(c);
}
int
CountBits2 (
int
x, int
*p)
{
int
i, j, t, c;
time(&start2);
for
(j = 0; j < 100000000; j++)
{
c = 0;
t = x;
for
(i = 0; i < 4; i++)
{
newByte.B = 0;
newByte.B ^= t;
c += *(p + newByte.B);
t >>= 8;
}
}
time(&finish2);
printf(
"\n\nTimer > %f\n"
,difftime(start2, finish2));
return
c;
}
int
CreateMas (
int
x) //counts bits = 1
{
unsigned
int
Mask = 1;
int
i, c = 0;
for
(i = 0; i <= 31; i++)
{
if
(Mask & x)
c++;
Mask <<= 1;
}
return
(c);
}
int
Pow(
int
x, int
y)
{
int
i, res;
res = 1;
if
(y == 0)
return
1;
else
{
for
(i = 0; i<y; i++)
res *= x;
return
res;
}
}
Автор
AlexGloock
Документ
Категория
Школьные материалы
Просмотров
86
Размер файла
27 Кб
Теги
lw1, glk
1/--страниц
Пожаловаться на содержимое документа