Зеркально поменять местами разряды младшего байта каждого числа - C (СИ)
Формулировка задачи:
Доброго времени суток.
1)Зеркально поменять местами разряды младшего байта каждого числа.
2)В тексте поменять местами первую и вторую половины каждого слова. Все
слова в тексте состоят из четного числа букв. В тексте несколько строк.
Решение задачи: «Зеркально поменять местами разряды младшего байта каждого числа»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
int main ()
{
unsigned ishodnoe_chislo=0, kopija_ishodnogo_chisla;
unsigned kolichestvo_sdviga_vpravo=0,kolichestvo_sdviga_vlevo=0;
unsigned starshij_bajt, mladshij_bajt, a=0, left=7, right=0,result=0,kopija_mladshego_bajta, seredina_stroki;
char str[80], substr1[80]="",substr2[80]="";
//clrscr();
//ПРЕОБРАЗОВАНИЕ ЧИСЛА . Здесь число должно быть от 0 до 65536 , т. е. не более 2-х байтов занимать**********************
printf("Vvedite 4islo: ");
scanf("%u", &ishodnoe_chislo);
printf("dano: %u", ishodnoe_chislo);
kopija_ishodnogo_chisla=ishodnoe_chislo;
starshij_bajt =ishodnoe_chislo & 65280;
ishodnoe_chislo = kopija_ishodnogo_chisla;
mladshij_bajt=ishodnoe_chislo & 255;
printf("\nstarshij_byte: %u", starshij_bajt);
printf("\nmladshij_byte: %u", mladshij_bajt);
kopija_mladshego_bajta= mladshij_bajt;
for (int i=1;i<8;i++)
{
mladshij_bajt=mladshij_bajt>>right; // убираем справа ненужные
mladshij_bajt=(mladshij_bajt<<7) ; // убираем слева ненужные
mladshij_bajt=mladshij_bajt&255; // отсекаем слева ненужные (которые за границей байта)
mladshij_bajt=mladshij_bajt>>right;// подводим этот бит туда, куда будем его вставлять
result=result|mladshij_bajt; // бит вставляем куда надо
left--;
right++;
mladshij_bajt=kopija_mladshego_bajta;
// printf("\nresult %d : %x",i, result);
}
printf("\nResulting variable: %u\n", starshij_bajt|result);
//КОНЕЦ ПРЕОБРАЗОВАНИЯ ЧИСЛА*********************************************************************************************
//ПРЕОБРАЗОВАНИЕ СТРОКИ (Строка обязательно должна содержать четное количесвто символов)***************************
printf("\nVvedite stroku(4etnoe kol-vo simvolov): ");
scanf("%s", &str);
seredina_stroki=strlen(str)/2;
memcpy(substr1,str,seredina_stroki);
while (str[seredina_stroki])
{
substr2[a]=str[seredina_stroki];
a++;
seredina_stroki++;
}
strcat(substr2,substr1);
printf("Resulting string: %s", substr2);
// КОНЕЦ ПРЕОБРАЗОВАНИЯ СТРОКИ*******************************************************************************
getch();
return 0;
}
Объяснение кода листинга программы
Вот что делает этот код:
- Преобразует введенное четырехзначное число в его двоичный эквивалент.
- Получает два байта из числа.
- Перемещает биты младшего байта вправо и старшего байта влево, сохраняя при этом биты младшего байта.
- Объединяет полученные биты с исходным числом.
- Запрашивает строку с четным количеством символов.
- Находит середину строки.
- Копирует символы из середины строки в новую строку.
- Добавляет символы из исходной строки в новую строку.
- Выводит полученную строку.