#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
, и устанавливать или отключать биты в любой позиции.