Мой вопрос заключается в следующем, я пытаюсь правильно создать функцию SetValue (неподписанных INT & вар, внутр к, неподписанных INT я, внутр вал)Как создать маску
Значение переменной является передача по reference value, int k - это раздел, i - наш индекс раздела, а val - это значение, которое мы передаем в ссылку. Теперь моя проблема в том, как создать маску.
Вот пример, я буду использовать 8 бит вместо полных 32 бит unsigned int.
Предположим, вар имеет следующее значение: (1011) (1001) Наше к = 2. Теперь предположим, что мы хотим передать значение 5 в индекс 1. Таким образом, мы должны сделать вар быть: (1011) (0101). Таким образом, чтобы добраться туда, нам нужно сделать следующие логические комбинации.
вар & маски, где маска равна (1111) (0000) вара = (1011) (0000) Тогда мы делаем, вар = вали | val
(1011) (000) (0000) (0101) |
(1011) (0101) Вопрос: как создать маску? Вот фрагмент кода, где я пытаюсь создать его (кстати, я поставил мой вар равным 0 в начале, прежде чем войти в функцию):
bitSize = sizeof(unsigned int)*8;
partionSize = (bitSize/k);
shiftCount = partionSize*i;
mask = ~((1<< partionSize)-1) << shiftCount;
var = var & mask;
val = val << shiftCount;
var = var | val;
Результаты, если я скажу, мой K = 2, и я Введите следующие 2 значения 5 и 3:
5:
shiftc рассчитывать до сих пор является: 0 Значение маски: 4294901760 Внутри функции, вар до сих пор является 5.
3:
Показатель сдвига до сих пор: 16 Значение маски: 0 Значение var равно 196608. Теперь, в 196608 году в двоичном формате это 110000000000000000, поэтому он явно сдвигался 3 раза и не заботился о сохранении 5. Иными словами, это должно быть 110000000000000101. Спасибо за любую помощь.
EDIT
я редактировал маска часть, чтобы выглядеть, как это сейчас:
if(i == 0)
{
mask = ~((1<< partionSize)-1);
}
else
{
mask = ~(((1<< partionSize)-1) << shiftCount);
}
Это, похоже, работал прямо сейчас. Потому что теперь, если я набираю 567 и 346, когда мой k = 2 (я использую два, чтобы облегчить мою жизнь для тестирования, если кто-то задается вопросом, почему это всегда 2).
Окончательное значение УАК 22676023, который в двоичном виде: +01010110100000001000110111 567: 01000110111 и 346: 0101011010
Оба из этих значений, как представляется, присутствует внутри нашей переменной в настоящее время. Вопрос к более опытным программистам на С ++, похоже ли это, похоже, логичная логика с моей стороны?
Что такое "функция var"? –
Функция var - это наше 32-битное представление. По сути, это переменная, в которой мы размещаем наши ценности. – SomeStudent
Вы посмотрели на 'std :: bitset'? –