Может ли кто-нибудь объяснить эту побитовую операцию

#c #bit-manipulation #bitwise-operators

#c #манипулирование битами #побитовые операторы

Вопрос:

Я пытаюсь понять, что происходит в этой побитовой операции, которая используется для установки размера массива символов, но я не до конца понимаю это.

 unsigned long maxParams = 2;// or some other value, I just chose 2 arbitrarily

unsigned char m_uParamBitArray[(((maxParams)   ((8)-1)) amp; ~((8)-1))/8]; 
  

Какой размер установлен для этого массива на основе значения maxParams ?

Ответ №1:

Это подсчитывает количество 8-битных символов, необходимых для подгонки maxParams битов.

7 заключается в округлении до следующего кратного 8.

0 -> 7 округляется до 0 символов

1 -> 8 округляется до 1 символа

После деления на 8. Что делается с помощью /8

Побитовое и заключается в отбрасывании последних трех битов перед делением на 8.

Ответ №2:

Когда maxParams не делится на восемь, первая часть формулы формулы округляет ее до следующего кратного восьми; в противном случае число остается неизменным. Вторая часть формулы делит результат на восемь, что всегда можно сделать, не получая остатка.

В общем, если вы хотите округлить до N , не переходя к нему, вы можете добавить N-1 перед разделением:

 (x   (N - 1)) / N
  

Вы можете безопасно удалить amp; ~((8)-1) часть выражения:

 (maxParams   (8-1))/8