 |
|
Очень нужна помощь! помогите решить задачку по с++
Всем доброго времени суток! Помогите пожалуйста написать программу С++, введя с клавиатуры целое число типа int и вывести его двоичное представление на экран затем выполняет преобразование, и после вывести на экран двоичное представление результата преобразования. затем сделать следующее:
Условие программы:
Назовем симметричным байт, в котором нулевой бит имеет такое же значение, что и седьмой, а первый – такое же, что и шестой. Изменить порядок следования симметричных байтов в числе на обратный.
И если сможете, сделайте так чтобы преобразование осуществлялось с помощью битовых операций. Использование массивов для представления битов числа нежелательно.
Буду очень признателен если поможете)
Т.е. программа должна преобразовать введенное с клавиатуры число в десятичной системе, затем преобразовывает его в двоичную, а в итоге вывести на экран шестнадцатиричный код введенного десятичного числа с клавиатуры, и затем с помощью сдвигов поучить следующее → (как пример) 0xDEADBEEF → 0xDEEFBEAD. Если перевести число DEADBEEF в десятичный код результат будет 3 735 928 559) и уже сдвиги делать для этого числа DEADBEEF.
1) я должен ввести число с клавиатуры 3 735 928 559, затем оно появляется на экране;
2) преобразовать это числа в двоичный и шестнадцатиричный код и также вывести их на экран;
3) нужно сделать чтобы это число 0xDEADBEEF (после всех сдвигов по условию) вывело на экран 0xDEADBEEF → 0xDEEFBEAD.
Заранее большущее спасибо!
|
Ivan767, а можно спросить?
Как так получилось из
Цитата:
Цитата Ivan767
0xDEADBEEF → 0xDEEFBEAD »
|
Единственный симметричный байт(и тот не байт) - это DB. Все остальное не симметрично!
Симметричный байты в приведенном примере 3 735 928 559 отсутствуют.
Что надо сделать понятно где-то наполовину.
Способ преобразования полностью на нашей совести?
|
lxa85, программу уже помогли написать, она ниже. теперь бы ее как нибудь по проще сделать нужно бы. посмотри пожалуйста может что сможешь сделать.
читать дальше »
Код:
#include <iostream>
#include <conio.h>
#include <vector>
using namespace std;
void ShowHex(unsigned int dec) {
vector<char> hex;
char hex_num[16] = {'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
};
while (dec/16 != 0) {
hex.push_back(hex_num[dec%16]);
dec = dec/16;
}
hex.push_back(hex_num[dec%16]);
for (int i = hex.size()-1; i >= 0; i--) {
cout << hex.at(i);
}
}
unsigned char* GenerateBytes(unsigned int dec) {
unsigned char *x = new unsigned char[4];
x[0] = dec >> 24;
x[1] = dec >> 16;
x[2] = dec >> 8;
x[3] = dec;
return x;
}
bool CheckByte(unsigned char byte) {
//195 = 11000011
//66 = 01000010
//129 = 10000001
if ( (byte & 195 == 0) || (byte & 195 == 66) ||
(byte & 195 == 129) || (byte & 195 == 195) ) {
return true;
}
else
return false;
}
int Castling(unsigned int dec) {
unsigned char *bytes = GenerateBytes(dec);
int number, number_byte[4];
int count_symmetric = 4;
for (int i = 0; i < 4; i++) {
if (CheckByte(bytes[i]) == false) {
number_byte[i] = int(bytes[i]) << 8*(3-i);
count_symmetric--;
}
}
//перестановка симметричных байтов
if (count_symmetric == 1) {
for (int i = 0; i < 4; i++) {
if (CheckByte(bytes[i]) == true) {
number_byte[i] = int(bytes[i]) << 8*(3-i);
}
break;
}
}
else if (count_symmetric == 2 || count_symmetric == 3) {
for (int i = 0; i < 4; i++) {
if (CheckByte(bytes[i]) == true) {
for (int j = 3; j > 0; j--) {
if (CheckByte(bytes[j]) == true) {
number_byte[i] = int(bytes[j]) << 8*(3-i);
number_byte[j] = int(bytes[i]) << 8*(3-j);
break;
}
}
break;
}
}
}
else if (count_symmetric == 4) {
for (int i = 0; i < 4; i++) {
number_byte[i] = int(bytes[3-i]) << 8*(3-i);
}
}
number = number_byte[0] | number_byte[1] | number_byte[2] | number_byte[3];
return number;
}
//---------------------------------------------------------------------------
int main()
{
unsigned int x, x_end;
cin >> x;
ShowHex(x);
cout << endl;
x_end = Castling(x);
ShowHex(x_end);
getch();
return 0;
}
|
Время: 19:16.
© OSzone.net 2001-