C программирование: изменение битов в зависимости от их положения на 0 - PullRequest
0 голосов
/ 16 апреля 2020

Как будет выглядеть код для этой функции? Извините, я самообучающийся и новичок в программировании

Создайте функцию с именем reset_bits (int value, int pos, int n), которая устанавливает каждый из n последовательных битов значения в позиции битов pos, pos + 1 , ..., pos + n - 1, к значению бита 0, и выводит результат в шестнадцатеричном формате. Например, reset_bits (0x8C3E, 2, 3) выведет 0x8C22, что является результатом установки битовых позиций 2, 3 и 4 для 0x8C3E в 0. Вы можете предположить, что все битовые позиции, указанные в pos и n, действительны битовые позиции. Единственной библиотечной функцией C, которую вы можете использовать, является printf ().

Это практическая проблема в моей книге по программированию C, но у меня нет руководства по решениям.

Шаблон:

    #include <stdio.h>
    #include <limits.h>

 int reset_bits(int value, int position, int n) {
     int r = pos + 1;
     int l = pos + n;
     int range = (((0xFF << (r - 1)) - 1) ^ ((0xFF << (l) - 1));
     int answer = value | range;

  printf("%x", answer);
  printf("\n");
    }

    int main() {
        reset_bits(0x8C3E, 2, 3); 
    }

1 Ответ

0 голосов
/ 16 апреля 2020

Функция может выглядеть, например, следующим образом

#include <stdio.h>
#include <limits.h>

int reset_bits( int value, size_t position, size_t n ) 
{
    const size_t Width = CHAR_BIT * sizeof( int );

    if ( position < Width )
    {
        if ( Width - position < n ) n = Width - position;

        value &= ~( ~( ~0u << n )  << position );
    }

    return value;
}

int main(void) 
{
    int x = 0x8C3E;

    printf( "%#X -> %#X\n", ( unsigned int )x, ( unsigned int )reset_bits( x, 2, 3) );

    return 0;
}

Выход программы:

0X8C3E -> 0X8C22
...