Міністерство освіти і науки України
Національний університет "Львівська політехніка"
Лабораторна робота №11
ПЕРЕВЕДЕННЯ ЧИСЕЛ В ПОЗИЦІЙНІ СИСТЕМИ ЧИСЛЕННЯ
Мета роботи:
засвоєння поняття позиційної системи числення, методи переходу з однієї системи числення в іншу, набуття навиків програмування операцій переходу, закріплення навиків застосування циклів та символьних змінних.
Завдання 1
ПЕРЕВЕДЕННЯ ЧИСЕЛ В ПОЗИЦІЙНІ СИСТЕМИ ЧИСЛЕННЯ
Перевести натуральні десяткові числа в їх двійкові еквіваленти методом ділення та методом маскування. Кожен з методів реалізувати у вигляді функції. Користувач повинен мати можливість вибору методу переведення. Результат повинен бути одержаний у вигляді послідовності символів і збережений у символьній змінній. Вивід результатів здійснювати на екран та у текстовий файл.
Аналіз завдання:
для переведення чисел з десяткової у двійкову систему числення треба використати алгоритми «ділення» та «маскування». Для першого алгоритму достатньо ділити число на 2, та записувати остачу. Для економії пам’яті вивід числа в 10-й системі числення буде змінною. Для того ми повинні додати до остачі принаймні двійку (для того, що б не було нулів та одиниць, адже система може проігнорувати нулі та операції з ними не будуть дотупні). Тому додамо до значення остачі 2, тоді замість 0 чи 1 отримаємо 2 чи 3. В кінцевому результаті просто віднімемо 2.
Алгоритм програми:
Головна функція
Ділення
Маскування
Текст програми:
#include <stdio.h>
#include <stdlib.h>
void perevid_dilenna(int x,int buff,int bit) {
while(0 != x)
{
printf("%d\t%d\n",x/2,x%2);
if(x%2)
buff++;
x/=2;
if(x!=0)
buff *= 10;
}
while(buff!=0){
bit *=10;
bit += (buff%10);
buff /=10;
}
bit -=2;
printf("%d\n",bit);
puts("");
FILE *file;
file = fopen("info.txt", "w");
fprintf(file,"Chuslo v dviykoviy sustemi chuslenna - %d", bit);
fclose(file);
}
void perevid_maskuvanna(int x,int mask,int i,float bit) {
while (mask<=x){
mask = pow(2,i);
printf("%d\t%d\n",i,mask);
if(i==29) break;
i++;
}
if(mask>2) mask = mask >> 1;
while(mask!=0){
if(x&mask) bit++;
if(mask!=1)bit *= 10;
mask = mask >> 1;
}
printf("%f",bit);
FILE *file;
file = fopen("info.txt", "w");
fprintf(file,"Chuslo v dviykoviy sustemi chuslenna - %f", bit);
fclose(file);
}
int main(int argc, char *argv[]) {
char answ;
puts("Dla perevedenna metodom dilenna najmit 'd' , Dla perevedenna metodom maskuvanna najmit 'm' ");
printf("Metod -> ");
scanf("%c", &answ);
int x;
switch(answ)
{
case 'd':
{
printf("Vvedit chuslo");
puts("");
scanf("%d", &x);
perevid_dilenna(x,2,0);
break;
}
case 'm':
{
printf("Vvedit chuslo");
puts("");
scanf("%d", &x);
perevid_maskuvanna(x,0,0,0);
break;
}
}
system("PAUSE");
return 0;
}
Результати:
Завдання 2 :
ПОБІТОВІ ЛОГІЧНІ ОПЕРАЦІЇ
Програмa повинна виконувати:
1. зчитування з клавіатури рядок iз 8-и символів (0 та 1);
2. перетворювання задану комбінацію у змінну цілого типу, яка займає в пам'яті 1 байт;
3. інвертування і-х та j-х бітів;
4. інвертування всіх 8-х бітів;
5. встановлення a-го біта в 1 ;
6. встановлення всіх бітів в 1;
Результати виконання кожного кроку виводити на екран у вигляді 16-кової цілої та двійкового коду.
Для отримання двійкового коду числа використати функцію, яка реалізовує метод маскування з попередньої задачі.
Індивідуальне завдання:
Рядок символів
a
i
j
00011011
2
7
8
Алгоритм програми:
Код програми:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define A 1
#define I 6
#define J 7
int Masking(int x);
unsigned char Convert(int bit_v);
int main(int argc, char *argv[])
{
unsigned char byte;
int bin_v;
scanf("%d", &bin_v);
byte=Convert(bin_v);
printf("%d\t%X\n",byte,byte);
byte ^= (int) (pow(2,I)); //інвертування I-го біта
printf("%d\t%X\n",perevid_maskuvanna(byte),byte);
byte ^= (int) (pow(2,J)); //інвертування J-го біта
printf("%d\t%X\n",perevid_maskuvanna(byte),byte);
byte = ~byte; //інвертування всього коду
printf("%d\t%X\n",perevid_maskuvanna(byte),byte);
byte |= (int) (pow(2,A)); // А-й біт в 1
printf("%d\t%X\n",perevid_maskuvanna(byte),byte);
byte |= 0xFF; // Всі біти в 1 (0xFF - 256 в 16-й системі числення
printf("%d\t%X\n",perevid_maskuvanna(byte),byte);
system("pause");
return 0;
}
int perevid_maskuvanna(int x) {
int mask=0,i=0;
int bit=0;
while (mask<=x){
mask = (int) pow(2,i);
if(i==29) break;
i++;
}
if(mask>2) mask = mask >> 1;
while(mask!=0){
if(x&mask) bit++;
if(mask!=1)bit *= 10;
mask = mask >> 1;
}
return bit;
}
unsigned char Convert(int bit_v){
int i=0;
unsigned char x=0;
while(bit_v!=0){
if(bit_v%10) x |= (int) pow(2,i);
bit_v /=10;
i++;
}
return x;
}
Результати:
Висновок:
на цій лабораторній роботі я навчився переводити числа з десяткової у двійкову систему числення різними методами : маскуванням та діленням. Я написав програму, яка використовує ці алгоритми переводу чисел та автоматично їх переводить. Також я навчився програмно виконувати побітові логічні операції.