- •Содержание:
- •Введение.
- •Задача 1(№127)
- •Текст программы:
- •Задача 2(№133)
- •Текст программы:
- •Задача 3(№145)
- •Текст программы:
- •Задача 4(№161)
- •Текст программы:
- •Задача 5(№172)
- •Текст программы:
- •Задача 6(№177)
- •Текст программы:
- •Задача 7(№187)
- •Текст программы:
- •Текст программы:
- •Задача 9(№200)
- •Текст программы:
- •Список используемой литературы
Задача 4(№161)
Постановка задачи: Напишите функцию setbits(x, p, n, y), возвращающую значение x, в котором n бит, начиная с р-ой позиции справа, заменены на n правых разрядов из y.
Алгоритм: Создается переменная onebit, имеющая вначале одну единичку в самом правом разделе. Эта величина сравнивается с аргументом n с помощью оператора & и сдвигается после каждого сравнения влево. Если результат сравнения не 0, значит в соответсвующем разделе n и onebit единичка, а в противном случае 0. В строчку s заносится соответсвующий символ, затем строчка ревенсируется библиотечной функией.
Текст программы:
# include <string.h>
typedef char Typei; // Typei целый тип
char*itobin (Typei n, char*s)
{
int i,d;
int size = sizeof(Typei)*8; // Размер целого типа в битах
Typei onebit =1; // Заполнение S двоичными цифрами, начиная с последней
for (i=0; i<size; i++, onebit <<=1)
s[i]= n& onebit ? '1':'0';
s[i]='\0';
strrev(s);
return s;
}
# include <iostream>
# include <conio.h>
using namespace std;
int main()
{
char s[32]; // Массив для дфоичных цифр
cout <<"\nPa6ota s 6ezznakovimi \n";
unsigned char p =100,q=200,sum,diff,q1;
cout <<"p="<< int(p)<<"="<<itobin(p,s)<<endl;
cout <<"q="<< int(q)<<"="<<itobin(q,s)<<endl;
sum=p+q;diff=p-q;
cout <<"p+q="<<int(sum)<<",p-q="<<int(diff)<<endl;
q1=q>>2;
cout << "q>>2="<<int(q1)<<"="<<itobin(q1,s)<<endl;
cout<<"Pa6ota so znakovimi \n";
char z=127,z1=z+1;
cout<<"z="<<int(z)<<"="<<itobin(z,s);
cout<<",z+1="<<int(z1)<<"="<<itobin(z1,s)<<endl;
char x=-59,y;
cout<<"x="<<int(x)<<"="<<itobin(x,s)<<endl;
y=x | 017;
cout<<"x | 017 ="<<int(y)<<"="<<itobin(y,s)<<endl;
y= x&017;
cout<<"x$017 ="<<int(y)<<"="<<itobin(y,s)<<endl;
y=x^017;
cout<<"x^017 ="<<int(y)<<"="<<itobin(y,s)<<endl;
y=~x;
cout<<"~x ="<<int(y)<<"="<<itobin(y,s)<<endl;
y=x<<2;
cout<<"x<<2 ="<<int(y)<<"="<<itobin(y,s)<<endl;
y=x>>2;
cout<<"x>>2 ="<<int(y)<<"="<<itobin(y,s)<<endl;
getch();
return 0;
}
Задача 5(№172)
Постановка задачи: Напишите программу для анализа внутреннего представления величин типа double. Предусмотрите возможность задания различных значний переменной типа double путем записи в отведенный под нее байты некоторых значений. Исследуйте, как выглядт внутреннее представление наибольшего и наименьшего положительного значения типа double.
Текст программы:
ypedef union{ // Объединение можно рассматривать
double f; // как float
char str[sizeof(double)]; // или как массив символов
unsigned long l[2]; // или как long
}float_chars_long;
#include <iostream>
#include <conio.h>
using namespace std;
void prn_long_bin( unsigned long x )
{
int i,
n = sizeof( unsigned long ) * 8; // n- число двоичных разрядов в long
unsigned long h;
h= 1L << n - 1; //В Старшем разряде у h 1 и 0 в остальных
for ( i=1 ; i<= n;i++){
cout << ((x & h)!=0)<<(1 % 8 ?"":"");
x <<=1;
}
}
void main()
{
float_chars_long var;
char c,i;
cout<<"\n Vvedite chislo s plaf . \n";
cout<<"\n chislo as hex as bin\n";
while((cin>>var.f)!=NULL){
cout<<var.f<<'\t';
for(i=1;i<=sizeof(double);i++){
c=var.str[sizeof(double)-i];
cout<<hex<<((c & 0Xf0)>>4)<< (c & 0X0f)<<' ';
}
cout.put('\t');
prn_long_bin(var.l[1]);
prn_long_bin(var.l[0]);
cout<<endl;
}
getch();
}