2016-10-05 4 views
-1

Я новичок здесь, но у меня есть некоторые вопросы о моем Computing 2 HW.Побитовые операторы

Учитывая основные функции:

void set_flag(int* flag_holder, int flag_position); 
int check_flag(int flag_holder, int flag_position); 

int main(int argc, char* argv[]) 
{ 
    int flag_holder = 0; 
    int i; 
    set_flag(&flag_holder, 3); 
    set_flag(&flag_holder, 16); 
    set_flag(&flag_holder, 31); 
    for(i = 31; i >= 0; i--) { 
     printf("%d", check_flag(flag_holder, i)); 
     if(i % 4 == 0) 
      printf(" "); 
    } 
    printf("\n"); 
    return 0; 
} 

Мы должны завершить set_flag и check_flag и его предполагаемыми для отображения:

1000 0000 0000 0001 0000 0000 0000 1000

Теперь я действительно изо всех сил, чтобы понять, это. flag_holder должен равняться 0 все время? Мой профессор сказал использовать поразряд и не умножать. Но похоже, что я мог бы просто реализовать массив из 32 '0 и установить 3-й, 16-й и 31-й элементы как 0s? Я заранее извиняюсь за беспорядочную настройку и спасибо тем, кто действительно читал это и помогал!

+1

«Я заранее извиняюсь за беспорядочный набор вверх "- вы действительно пишете весь свой код на одной строке? В любом случае, я исправил его для вас, чтобы люди могли вам помочь. –

+0

Кроме того, как каждый должен знать, что ваша проблема, когда вы не показываете нам весь ваш код? Если вы выполняете 'set_flag' и' check_flag', вы знаете, работают ли они или нет? Пожалуйста, исправьте это. –

+3

«Но похоже, что я мог бы просто реализовать массив из 32 '0». Вы могли бы, но это не было целью упражнения. Вы должны манипулировать битами в переменной 'int'. Поэтому непонятно, какую помощь вы хотите от нас. – kaylum

ответ

0

Позвольте мне сказать вам сходство между умножением и побитового

сдвиг влево & сдвиг вправо используются для установки флагов в основном

2 = 0010 

, когда вы оставили дерьмо 2 на 1, все биты сдвигаются слева и с нулевым добавлением.

0010 << 1 
0100 

и результат будет

0100 = 4 

и далее левый сдвиг сделать 0100 в 1000 = 8

левый сдвиг похож умножить на 2 и сдвигают вправо аналогично разделить на 2

Установочные флаги

set_flag(&flag_holder, 3); 

функция будет более или менее походить на это

void set_flag(int *flag_holder, int shifter) { 
*flag_holder = *flag_holder | 1 << shifter; 
} 

, что это будет делать то, что третий бит установлен, не затрагивая другие биты

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

  • Нет связанных вопросов^_^