Написать программу, которая будет считывать с клавиатуры 4 десятичных числа x, y, m, n
. В числе x
младшие m
бит заменить на старшие m
бит из числа y
, потом инвертировать n
младших бит в числе y
. Все смещения бит указываются начиная с младшего (нулевого) бита. Программа должна выводить исходные данные в десятичном виде, а полученные значения x
, y
вывести в двоичном виде в табличной форме, напротив двоичного числа выведите имя соответствующей переменной.
Программа не должна содержать более одного цикла. Также запрещается использовать различные библиотеки и классы для работы с битами. Программа должна работать корректно, вне зависимости от используемой архитектуры.
К сожалению, решения данной задачи пока нет. Если Вы решили эту задачу, сообщите нам, и мы выложим её на сайте.
E-mail : admin@cppstudio.com
Комментарии
Oleg Sam
//———————————————
// bitmanip_V_02
// компилятор: gcc 7.2.0
// ос: Андроид 5.0
// cpu: Arm Cortex a7
// порядок бит: от старшего к младшему
// oleg sam
//———————————————
#include <cstdio>
using namespace std;
typedef unsigned int u32;
const int bmsize = 32;
// так как условия задачи 1 цикл
// пришлось делать вот такой бит маск массив
static u32 bit_mask[ bmsize ] = {
0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff,
0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff, 0x3fff, 0x7fff, 0xffff,
0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff,
0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, 0x1fffffff, 0x3fffffff,
0x7fffffff, 0xffffffff };
int main()
{
u32 x, y;
int m, n;
//—————————————————
printf(«Введите x: » );
scanf(«%u», &x );
printf(«Введите y: » );
scanf(«%u», &y );
printf(«Введите m: » );
scanf(«%d», &m );
printf(«Введите n: » );
scanf(«%d», &n );
//—————————————————
if( ( m < 1 || m > 32 ) || ( n < 1 || n > 32 ) )
{
printf(«числа m и n должы быть в деапозоне 1 — 32 \n» );
return 1;
}
x &= ( ~bit_mask[ m — 1 ]);
x += ( y >> ( 32 — m ) ) & bit_mask[ m — 1 ];
y ^= bit_mask[ n — 1 ];
//—————————————————
char xbuf[33], ybuf[33];
char *pxbuf = xbuf, *pybuf = ybuf;
for( u32 msc = 0x80000000; msc ; msc >>= 1 )
{
*pxbuf++ = msc & x ? ‘1’ : ‘0’;
*pybuf++ = msc & y ? ‘1’ : ‘0’;
}
*pxbuf = »;
*pybuf = »;
//—————————————————
printf(» x = %u | %s \n», x, xbuf );
printf(» y = %u | %s \n», y, ybuf );
//—————————————————
return 0;
}
Oleg Sam
версия 0.2 рабочая
Oleg Sam
// компилятор: gcc 7.2.0
// ос: Андроид 5.0
// cpu: Arm Cortex a7
// порядок бит: от старшего к младшему
// Ole San
//———————————————
//программа бессмысленная так как чтоб она
//работала в Y должно содержатся число как минимум
//большое 24 бит.чтобы было что скопировать в X
#include <cstdio>
using namespace std;
typedef unsigned int u32;
const int bmsize = 32;
// так как условия задачи 1 цикл
// пришлось делать вот такой бит маск массив
u32 bit_mask[ bmsize ] = {
0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff,
0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff, 0x3fff, 0x7fff, 0xffff,
0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff,
0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, 0x1fffffff, 0x3fffffff,
0x7fffffff, 0xffffffff };
int main()
{
u32 x, y;
int m, n;
//—————————————————
printf(«Введите x: » );
scanf(«%u», &x );
printf(«Введите y: » );
scanf(«%u», &y );
printf(«Введите m: » );
scanf(«%d», &m );
printf(«Введите n: » );
scanf(«%d», &n );
//—————————————————
if( ( m < 1 && m > 32 ) || ( n < 1 && n > 32 ) )
{
printf(«числа m и n должы быть в деапозоне 1 — 32 \n» );
return 1;
}
y = 0xffffffff;
u32 tmp_y = y >> ( 32 — m );
x = tmp_y & bit_mask[ m — 1 ];
y = ( y ^ bit_mask[ n — 1 ] );
//—————————————————
char xbuf[33], ybuf[33];
char *pxbuf = xbuf, *pybuf = ybuf;
for( u32 msc = 0x80000000; msc ; msc >>= 1 )
{
*pxbuf++ = msc & x ? ‘1’ : ‘0’;
*pybuf++ = msc & y ? ‘1’ : ‘0’;
}
*pxbuf = »;
*pybuf = »;
//—————————————————
printf(» x = %u | %s \n», x, xbuf );
printf(» y = %u | %s \n», y, ybuf );
//—————————————————
return 0;
}
Oleg Sam
ухты тут ошибка.Вместо и надо или.
if( ( m < 1 || m > 32 ) && ( n < 1 || n > 32 ))