Как с помощью маски сдвинуть единицы в двузначном коде числа влево без потерь - C (СИ)
Формулировка задачи:
Привет! подскажите пожалуйста как с помощью маски (или вообще как) сдвинуть единицы в двузначном коде числа влево без потерь и вывести потом десятичное значение получившегося числа в условиях нижеприведенной программы. текст программы такой:
Заранее благодарен.
#include<stdio.h>
#include<conio.h>
void main(void)
{
clrscr();
float m;
int i,k;
long *z;
printf("vvedite chislo \n");
scanf("%f",&m);
printf("vedennoe vami chislo m=%f\n",m);
z=(long*)&m;
for(i=0;i<32;i++)
{
if(k<8)
{
textcolor(k);
cprintf("%d",(*z)>>(31-i)&1);
k++;
}
else
{
k=1;
}
}
getch();
}Решение задачи: «Как с помощью маски сдвинуть единицы в двузначном коде числа влево без потерь»
textual
Листинг программы
#include <iostream>
int main(){
int n,nn=0;
std::cout<<"Enter n: ";
std::cin>>n;
for(int i=1;i;i<<=1)
nn=(nn>>(int)(bool)(n&i))|(((int)(bool)(n&i))<<31);
std::cout<<(unsigned)nn<<std::endl;
return 0;
}
Объяснение кода листинга программы
- Подключение заголовочного файла
для использования функций ввода-вывода. - В функции main() объявлены две переменные: n и nn, равные 0.
- Выводится запрос на ввод числа n.
- С помощью оператора >> число n считывается в переменную n.
- В цикле for, начиная с i=1, с шагом 2 в переменной i происходит сдвиг на 1 разряда вправо.
- Вычисляется значение nn = n & i, т.е. маска, в которой единицы на позициях, соответствующих ненулевым битам числа n.
- Результат предыдущего шага (nn) сдвигается влево на 31 разряд (наибольшая степень двойки, которая не больше 32).
- Результат этого сдвига (который будет равен исходному числу n, но с единицами на позициях, соответствующих ненулевым битам) или исходное число n сдвинутое на 31 разряд влево (что приведет к переносу всех единиц на начало числа).
- Полученный результат присваивается переменной nn.
- Выводится значение переменной nn.
- Возвращается 0, что означает успешный конец работы программы.