Операторы и выражения Проблема, которую я не могу решить в C # - PullRequest
0 голосов
/ 06 ноября 2018

Нам дают число n, значение v (v = 0 или 1) и позицию p. написать последовательность операций, которая изменяет значение n, чтобы бит в позиции p имел значение v. Пример: n = 35, p = 5, v = 0 -> n = 3. Другой пример: n = 35, p = 2, v = 1 -> n = 39.

Я не могу найти способ использовать только этот бит в позиции p.

Если я сделаю n >> p с числом, таким как 35 в битах, у меня будет 100011 >> 5 = 00001

Я не знаю, как получить значение v здесь. Математически, даже если я думаю об этом выше, значение n становится 1, а не 3 после этой операции. Я совершенно сбит с толку, так как не могу объяснить эту проблему самому себе.

  Console.Write("Enter n: ");
    int n = Convert.ToInt32(Console.ReadLine());
    Console.Write("Enter p: ");
    int p = Convert.ToInt32(Console.ReadLine());
    Console.Write("Enter v: ");
    int v = Convert.ToInt32(Console.ReadLine());
    int mask = n >> 5;
    Console.WriteLine(mask);

1 Ответ

0 голосов
/ 06 ноября 2018

Я бы выбрал такой подход:

  • Определить смещенное значение бита с помощью оператора <<
  • Если v равно 1, установите бит с помощью |
  • В противном случае очистите его, используя &~ для побитового отрицания для создания маски)

Так что-то вроде:

int shifted = 1 << p;

if (v == 1)
{
    n |= shifted; // Set the bit 
}
else
{
    // Clear the bit, by masking with the bitwise inverse  of the shifted value
    n &= ~shifted;
}
...