Ради интереса, я реализую алгоритм DES в Java. (Ну, на самом деле это не так весело).
В этом алгоритме вы обрабатываете блоки по 64 бита данных, и я подумал: эй, это прекрасно, давайте использовать «long» для хранения моих двоичных данных.
Затем я сталкиваюсь с серьезной проблемой, которая меня бесит: скажем, вы строите длинную, вот так:
long value = 785537;
Допустим, вы хотите установить для старшего значащего бита значение 1, вы бы сделали что-то вроде этого:
value |= 0x8000000000000000l;
Довольно просто, верно?
Но это не работает вообще. У Java нет проблем с изменением другого бита, что означает, что
value |= 0x7000000000000000l;
будет работать. Но это не сработает, если это самый важный бит.
Почему? Есть ли способ добиться того, чего я хочу?
Заранее спасибо за ваши ответы.
Редактировать:
Вот пример кода, который я написал, для отображения long в двоичном виде:
public static void printBits(long input){
StringBuilder builder = new StringBuilder();
for(int i = 0; i < 64; i++){
if((input & (0x1l << i)) != 0){
builder.append('1');
} else {
builder.append('0');
}
}
System.out.println(builder);
}
Если я сделаю это:
long val = -1;
printBits(val);
Он напечатает «1111111111111111111111111111111111111111111111111111111111111111111111111111111111111110», как и положено.
Если я тогда наберу:
val |= Long.MIN_VALUE;
printBits(val);
Или
val |= 0x8000000000000000l;
printBits(val);
Это печать "111111111111111111111111111111111111111111111111111111111111111111111111111110" также ...
Если затем выполнить следующий тест:
(val & 8000000000000000l) != 0;
Это ложь ...