#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