Просто and
это с инверсией бита (64-1):
x = x & ~63
// 64 is 000...0001000000
// 63 is 000...0000111111
// ~63 is 111...1111000000
Это в основном очищает младшие шесть битов, что равносильно округлению до кратного 64. Имейте в виду, что это округляет в сторону отрицательной бесконечности для отрицательных чисел, а не до нуля, но, похоже, это ваш вопрос требуется.
Вы можете увидеть поведение здесь в этом варианте, кратном четырем:
#include <stdio.h>
int main (void) {
int i;
for (i = -10; i <= 10; i++) {
printf ("%3d -> %3d\n", i, i & ~3);
}
return 0;
}
Это производит:
-10 -> -12
-9 -> -12
-8 -> -8
-7 -> -8
-6 -> -8
-5 -> -8
-4 -> -4
-3 -> -4
-2 -> -4
-1 -> -4
0 -> 0
1 -> 0
2 -> 0
3 -> 0
4 -> 4
5 -> 4
6 -> 4
7 -> 4
8 -> 8
9 -> 8
10 -> 8
Имейте в виду, что это работает только для степеней двух (например, 2 6 = 64) и дополнения до двух (стандарт ISO не предписывает такое представление - подробности см. здесь ) - но я никогда не видел среду C, в которой она не используется, и я работал над системами от самых маленьких 8051 до крупнейших мэйнфреймов). Если вы хотите использовать любой другой номер для делителя, вам, вероятно, следует использовать соответствующие математические функции, такие как floor
.