В примере provided here,Бит маскирования неподписанные и подписанные значения
We created a 64 bit ID that contains the shard ID = 16 bit, the type of the containing data = 10 bit, and where this data is in the table (local ID) = 36.
The savvy additionology experts out there will notice that only adds to 62 bits. My past in compiler and chip design has taught me that reserve bits are worth their weight in gold. So we have two (set to zero).
Так это значит:
Вопрос один:
Они могут иметь 2^16, диапазон 0- 65536 осколков?
Идентификатор типа 2^10, диапазон 0-1024 типов?
Местный идентификатор 2^36, диапазон 0-68719476736 местных идентификаторов?
Кроме того, я пытаюсь повторить их хэш-функции в Java
| представляет собой разделение двух наборов из 32 бит, чтобы облегчить визуализацию.
# представляет собой битовый сдвиг 46, охватывающий 18 бит, из которых 2 зарезервированы - ShardId
~ представляет собой битовый сдвиг 36, заключающий 10 бит - Идентификатор типа Оставшихся 36 бит - локальный ID:
# 0000 0000 0000 0000 00 # ~ 00 0000 0000 ~ 0000 | 0000 0000 0000 0000 0000 0000 0000 0000 |
- Binary из ShardID 3429 = 1101 0110 0101
- Поэтому (hashedValue >> 46) = 00 0000 1101 0110 0101 &
- 0xFFFF = 1111 1111 1111 1111
- ShardId = 00 0000 1101 0110 0101
Вопрос второй:
Я понимаю, что нужно для 1. и 2. Однако я не понимаю, почему нам нужен побитовый оператор & 0xFFFF, поскольку 4 & 2 фактически одинаковы.
Вопрос третий:
Я получаю следующее сообщение об ошибке компилятора: Буквальный 0xFFFFFFFFF типа междунара вне диапазона
public class BitExampleTest {
public static void main(String[] args) {
long pinId = 241294492511762325L;
unHash(pinId);
}
private static long hash(int shardId, int typeId, int localId){
return (shardId << 46) | (typeId << 36) | (localId << 0);
}
private static void unHash(long hashedValue){
long shardID = (hashedValue >> 46) & 0xFFFF;
long typeID = (hashedValue >> 36) & 0x3FF;
long localID = (hashedValue >> 0) & 0xFFFFFFFFF;
System.out.printf("shardID %s \n",shardID);
System.out.printf("typeID %s \n",typeID);
System.out.printf("localID %s \n",localID);
}
}
Q3: используйте буквенный длинный суффикс: '0xFFFFFFFFFL'. –
Очень интересно, что у SO не было подробного сообщения о бит-масках. +1 от меня –
Здесь нет «хеширующих значений». Все входные данные присутствуют на выходе. – EJP