Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <colors.h>
- using namespace std;
- void showBits(char b, int order, bool colorAsFloat = false){
- for(int i = 7; i >= 0; --i){
- int currentBit = (b >> i) & 0b1;
- if(colorAsFloat){
- int bitOrder = order*8 + 7-i;
- switch(bitOrder){
- case 0: // знак
- cout << BOLDBLUE;
- break;
- case 1: // порядок
- cout << BOLDGREEN;
- break;
- case 9: // мантисса
- cout << BOLDRED;
- break;
- }
- }
- cout << currentBit;
- }
- cout << " ";
- }
- // аллоцирует новый массив
- char* reverseArray(char* a, int size){
- char* b = (char*)malloc(sizeof(char) * size);
- for(int i = size - 1, j = 0; i >= 0; --i, ++j){
- b[j] = a[i];
- }
- return b;
- }
- void showBytes(char* a, int size, bool colorAsFloat = false){
- for (int i = 0; i < size; ++i) {
- char currentByte = a[i];
- showBits(currentByte, i, colorAsFloat);
- }
- cout << RESET;
- }
- bool isLittleEndian(){
- short tmp = 0x1;
- char* tmpBytes = (char*)&tmp;
- return tmpBytes[0] == 0;
- }
- void littleEndianShowBytes(char* a, int size, bool colorAsFloat = false){
- if(!isLittleEndian()){
- a = reverseArray(a, size);
- }
- showBytes(a, size, colorAsFloat);
- }
- void prog1(){
- int a;
- float b;
- cout << "Введите целочисленное число: ";
- cin >> a;
- cout << endl << "Введите дробное число: ";
- cin >> b;
- char* aBytes = (char*)&a;
- char* bBytes = (char*)&b;
- cout << "целочисленное число: ";
- cout << endl << "+ в памяти: ";
- showBytes(aBytes, sizeof(int));
- cout << endl << "+ Little Endian: ";
- littleEndianShowBytes(aBytes, sizeof(a));
- cout << endl << "дробное число: ";
- cout << endl << "+ в памяти: ";
- showBytes(bBytes, sizeof(float));
- cout << endl << "+ Little Endian: ";
- littleEndianShowBytes(bBytes, sizeof(b), true);
- }
- void prog2(){
- float a;
- cout << "Введите дробное число: ";
- cin >> a;
- char* aBytes = (char*)&a;
- cout << endl << "структура до изменения: ";
- littleEndianShowBytes((char*)&a, sizeof(a), true);
- cout << endl << endl;
- const int maxBitOrder = sizeof(a)*8 - 1;
- int changingBitOrder;
- cout << "Введите номер изменяемого бита (от меньшего разряда, с 0): ";
- cin >> changingBitOrder;
- if(changingBitOrder < 0 || changingBitOrder > maxBitOrder){
- cout << "Некорректное значение порядка (с 0 до " << maxBitOrder << " должно быть)";
- return;
- }
- int bitValue;
- cout << endl << "Укажите значение бита (0/1): ";
- cin >> bitValue;
- if(bitValue != 0 && bitValue != 1){
- cout << "Некорректное значение бита";
- return;
- }
- int mask = 1 << changingBitOrder;
- int aInt = *((int*)&a);
- int currentBitValue = (aInt & mask) >> changingBitOrder;
- if(currentBitValue != changingBitOrder){
- aInt ^= mask;
- }
- a = *((float*)&aInt);
- cout << endl << endl;
- cout << "структура после изменения: ";
- littleEndianShowBytes(aBytes, sizeof(a), true);
- cout << endl << "новое дробное число: " << a;
- }
- int main(){
- prog1();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement