Битовые операции сдвига и перестановки - C (СИ)
Формулировка задачи:
Ребят, всем привет, помогите пожалуйста с задачей, ничего не понимаю, первокурсник
Написать программу, которая позволит ввести два числа типа insigned int с клавиатуры, напечатать их на дисплее, используя битовые операции поменять местами в них четные биты второго числаина нечётные биты первого, вывести результат.
VS 2008 , C
Заранее спасибо!
Решение задачи: «Битовые операции сдвига и перестановки»
textual
Листинг программы
static class Program
{
static string ToBS(this uint x)
{
return Convert.ToString(x, 2).PadLeft(sizeof(uint) * 8, '0');
}
static void Main()
{
uint a = Convert.ToUInt32(Console.ReadLine(), 2);
uint b = Convert.ToUInt32(Console.ReadLine(), 2);
uint mask = 0x55555555;
uint a1 = a & ~mask | (b & ~mask) >> 1;
uint b1 = b & mask | (a & mask) << 1;
Console.WriteLine("old a = {0}", a.ToBS());
Console.WriteLine("old b = {0}", b.ToBS());
Console.WriteLine("new a = {0}", a1.ToBS());
Console.WriteLine("new b = {0}", b1.ToBS());
Console.ReadLine();
}
}
Объяснение кода листинга программы
- Объявлена статическая метода
ToBS, которая принимает на входuintи возвращает строку с двоичным представлением числа, дополненным слева нулями до полного байта (8 бит). - В методе
Mainсчитываются два числа от пользователя вuintпеременныеaиbсоответственно. - Объявлены две переменные:
maskравная 0x55555555 (что в двоичном виде равно 0xFFFFFFFF, т.е. максимальное число, которое можно сдвинуть на 1, не меняя его значения) иa1,b1которые будут использоваться в дальнейшем. - С помощью битовой операции AND (
&) и сдвига (>>) в переменнуюa1записывается результат вычисленияa & ~mask | (b & ~mask) >> 1. То есть, из двоичного представления числаaудаляются все единицы, которые были во всех четных битах (что соответствует маске), и на их место записываются все единицы из двоичного представления числаb, которые были во всех нечетных битах (что также соответствует маске), сдвинутые на 1. - С помощью битовой операции AND (
&) и сдвига (<<) в переменнуюb1записывается результат вычисленияb & mask | (a & mask) >> 1. То есть, из двоичного представления числаbудаляются все единицы, которые были во всех четных битах (что соответствует маске), и на их место записываются все единицы из двоичного представления числаa, которые были во всех нечетных битах (что также соответствует маске), сдвинутые на 1. - Выводятся на экран двоичные представления чисел
aиb(через методToBS) с помощьюConsole.WriteLine. - Выводятся на экран двоичные представления чисел
a1иb1(через методToBS) с помощьюConsole.WriteLine. - Программа ожидает ввода от пользователя с помощью
Console.ReadLine.