Манипуляции с битами

Уровень сложности:

Написать программу, которая будет считывать с клавиатуры 4 десятичных числа x, y, m, n. В числе x младшие m бит  заменить на старшие m бит из числа y, потом инвертировать n младших бит в числе y. Все смещения бит указываются начиная с младшего (нулевого) бита. Программа должна выводить исходные данные в десятичном виде, а  полученные значения x, y вывести в двоичном виде в табличной форме, напротив двоичного числа выведите имя соответствующей переменной.

Программа не должна содержать более одного цикла. Также запрещается использовать различные библиотеки и классы для работы с битами. Программа должна работать корректно, вне зависимости от используемой архитектуры.

К сожалению, решения данной задачи пока нет. Если Вы решили эту задачу, сообщите нам, и мы выложим её на сайте.

E-mail : admin@cppstudio.com

Следующие статьи помогут вам в решении данной задачи:
Автор: admin
Дата: 13.09.2012
Поделиться:

Комментарии

  1. 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;

     

    }

     

     

  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;

     

    }

     

     

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.