имитация распределения данных с помощью массива int

#java #binary #bit-manipulation

#java #двоичный #манипулирование битами

Вопрос:

Итак, у меня есть это назначение для имитации выделения данных. Это выглядит следующим образом

это массив int[], элементы которого в двоичном формате составляют таблицу распределения, подобную:

int[0] = 0xFF = 1111 1111;

1 считается свободным, а 0 выделяется

если вы вызываете метод get() (также get(int), где int — количество выделяемых битов), то он находит первый фрагмент «свободного» пространства и изменяет значение на 0. free() (свободно (int numbits) или свободно (int numbits, int fromIndex)) изменяет биты обратно на 1. примеры:

данные == 1111 0011
x.get(3);
данные == 0001 0011
x.get(2);
данные == 0001 0000
x.get();
данные == 0000 0000
x.free(2);
данные == 1100 0000
x.free(2, 5);
данные == 1100 0110

Все элементы в массиве int объединяются, поэтому, если есть 2 элемента, двоичное представление будет составлять 16 бит 1. Распределение должно быть в состоянии происходить по всем элементам массива.

Как я могу добиться этого, используя побитовые операторы и целое число.метод toBinaryString(). Это задание, поэтому я хотел бы, чтобы в нем было больше советов, чем реальных ответов. Надеюсь, я объяснил это достаточно хорошо.

Ответ №1:

Ниже приведены две полезные функции, которые есть в моем инструментарии для двоичных операций.

 boolean isSet(int value, int bit){
   return (valueamp;(1<<bit))!=0;
}  

int setBit(int value, int bit){
   return value|(1<<bit);
}
  

По сути, вы проверяете, установлен ли данный бит, заменяя его другим int , в котором установлены все нули и только тот бит, который вас интересует. Результирующее значение содержит нули в каждом бите, но этот бит будет установлен только в том случае, если он был установлен в исходном значении. В противном случае этот бит равен 0 (поскольку 0 И 1 равны 0), что делает весь результат равным 0. Ненулевой результат означает, что бит был установлен.

Чтобы установить бит, вы просто задаете ему значение, содержащее нули в каждом бите и 1 в бите, который вы хотите установить. Это дает результат, в котором все остальные биты такие же, какими они были в исходном значении, но 1 в бите, который вы хотите установить.

Используя это, вы можете обрабатывать любой массив, int очень похожий на размер 32 boolean , и устанавливать или отключать биты в любой позиции.