2015-08-28 2 views
1

Мой вопрос заключается в следующем, я пытаюсь правильно создать функцию 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

Оба из этих значений, как представляется, присутствует внутри нашей переменной в настоящее время. Вопрос к более опытным программистам на С ++, похоже ли это, похоже, логичная логика с моей стороны?

+0

Что такое "функция var"? –

+0

Функция var - это наше 32-битное представление. По сути, это переменная, в которой мы размещаем наши ценности. – SomeStudent

+0

Вы посмотрели на 'std :: bitset'? –

ответ

0

Это пример битовой маски: позволяет сказать, что у нас есть буквы «А» до «D»

A = 1 //on 
B = 0 //off 
C = 1 
D = 1 

Мы хотим маску, которая выглядит как 1011

Мы начинаем с mask = 1 и OR его с 1 .

Для письма: с mask = mask | 1 или просто mask |= 1

Для буквы Ь: мы ничего не делаем потому, что он «Ы не установлен, и так далее

mask = 1; 
a => mask |= 1  //(mask |= (1<<0)) 
//b => mask |= 2; //(mask |= (1<<1)) 
c => mask |= 4;  //(mask |= (1<<2)) 
d => mask |= 8;  //(mask |= (1<<3)) 

результат маска 1101. Обратите внимание, ранее я сказал, что мы хотим 1011, это то же самое, за исключением того, что биты меняются на противоположные.

void SetValue(unsigned int &mask, int index, int turn_on) 
{ 
    if (turn_on) 
     mask |= (1 << index); 
} 

int GetValue(unsigned int mask, int index) 
{ 
    return (mask >> index) & 1; 
} 

int main() 
{ 
    unsigned int mask = 1; 

    SetValue(mask, 0, 1);//A 
    SetValue(mask, 1, 0);//B 
    SetValue(mask, 2, 1);//C 
    SetValue(mask, 3, 1);//D 
    //up to SetValue(mask, 31, 1); 

    //mask is now equal to 13, or 1101 
    std::cout << mask << std::endl; 

    for (int i = 0; i < 4; i++) 
     std::cout << GetValue(mask, i); 

    //This prints 1011 (reverse of 1101). 
    //Again this has to do with the way we 
    //are printing the bits. 

    std::cout << "\n"; 
} 
+0

Не уверен, что это то, о чем вы просите. Дайте мне знать, не ответит ли этот ответ на ваш вопрос, и я удалю его. –

+0

Я успешно понял это, но я был бы признателен, если бы вы сохранили код. Может пригодиться, и я хотел бы посмотреть, смогу ли я это понять. Быстрый вопрос, не XOR ^, | Регулярно ИЛИ – SomeStudent

+0

Я не знаю, почему я сказал «XOR», я имел в виду «ИЛИ», я изменил сообщение –

Смежные вопросы