2012-08-24 3 views
0

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

Скажем, у меня есть целое число х, которое делится на PAGE_S

делает это производит целое число, которое делится на PAGE_S?

x^ ~(PAGE_S-1); 

so (x % PAGE_S) == ((x^ ~(PAGE_S-1)) % PAGE_S)? Насколько я проверил, он работает, но мне нужно, чтобы понять, почему ...

пса это часть коды трансляции виртуальных адресов памяти в физические адреса

ответ

2

Да, но только если это PAGE_S мощность двух.

Если PAGE_S является степенью двух (скажем, 2 k), то его двоичное представление является 1, за которым следует k 0s. Итак, PAGE_S-1 будет k 1s в двоичном формате, поэтому ~(PAGE_S-1) - это все 1 с, а затем k 0s.

Операция xor (^) перевернет любые биты первого операнда, для которого соответствующий бит во втором операнде равен 1; например, 101101^111000 - 010101, потому что первые три бита перевернуты.

Поскольку x делится на PAGE_S, последние k бит должны быть равны нулю. Поскольку последние k бит ~(PAGE_S-1) также равны нулю, последние k бит x^~(PAGE_S-1) равны нулю, поэтому они делятся на PAGE_S. Это также инвертирует все остальные биты x.

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

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