|
|
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
Стыдно, но не могу вспомнить теорию, позволяющую понять почему BitSet-у достаточно шести лонгов, чтобы хранить массив размера 2^31-1 битов. судя по тому, что 2 бита позволяют закодировать 4 разных числа 3 бита - 8, то (2^31)-1 битов, то нам нужно число диапазона 2^((2^31)-1 ). Как это вяжется с шестью 64 битными лонгами - не понимаю. ну или пойти с другой стороны: лонг это 64 бита, 6 лонгов это 64*8 битов. это ведь всяко много меньше (2^31)-1 Объясните пожалуйста ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 13:44 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
questionerпочему BitSet-у достаточно шести лонгов, чтобы хранить массив размера 2^31-1 битов. Подтверждено эксперементально? questionerлонг это 64 бита, 6 лонгов это 64*8 битов. Что-то с арифметикой тут тоже не так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 13:57 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
BlazkowiczПодтверждено эксперементально? Наверно человек так понял java.util.BitSet/* * BitSets are packed into arrays of "words." Currently a word is * a long, which consists of 64 bits, requiring 6 address bits. * The choice of word size is determined purely by performance concerns. */ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 16:01 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевBlazkowiczПодтверждено эксперементально? Наверно человек так понял java.util.BitSet/* * BitSets are packed into arrays of "words." Currently a word is * a long, which consists of 64 bits, requiring 6 address bits. * The choice of word size is determined purely by performance concerns. */ Да, вы правы,а как это правильно истолковать? Blazkowicz Что-то с арифметикой тут тоже не так. Очепятка 64*6 конечно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 16:03 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
questioner, Ну примерно так. Хранится в массиве long[] Для того чтобы узнать в каком по счету long хранится бит делается следующая операция Код: java 1. 2. 3. Собственно установка бита делается (если упростить для понимания, откинув всякие expand) Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 16:22 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевquestioner, Собственно установка бита делается (если упростить для понимания, откинув всякие expand) Код: java 1. |= а что за операция такая? long h |= (1L << 2); так например нельзя написать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 16:49 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 16:51 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
questioner, для |= надо иметь предыдущее значение. это эквивалент h = h | ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 16:52 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевquestioner, для |= надо иметь предыдущее значение. это эквивалент h = h | аа понятно это OR Теперь по поводу выбора нужного long. Почему смещение именно на 6 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 16:55 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
questioner, 2^6=? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 16:56 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
questioner, long это "слово" в реализации BitSet его размер 64 бита Чтобы получить бит по индексу надо произвести две операции 1. Получить индекс long-а в массиве 2. Получить индекс бит-а внутри long-а индекс long-а это индекс бита делённый на 64 64 = 2^6 деление на 64 эквивалентно сдвигу на 6 позиций вот и выходит индекс long-а это индекс бита >> 6 Код: java 1. 2. 3. Индекс бита внутри лонга это остаток от деления индекса бита на 64. Но нам особо не нужен, так как long это не массив - по индексу не адресуешь. Для того чтобы проверить или установить значение бита нужно наложить маску на этот бит. Для получения маски берём единицу 1L и сдвигаем влево на нужную позицию. Сдвиг цикличный, поэтому не паримся на счет границ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 17:21 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Спасибо, разжевали. Один момент только не уловил: Код: java 1. пуска у нас индекс попал в первый лонг (он же нулевой) и пусть это будет 20(аргумент метода set). 1 это же 0...[63 штуки]1 1<<20 это ведь будет 0...[39 штук] 10...[20 штук] и получится, что мы установили 40 бит вместо 20 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 18:14 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
или они с конца пронумерованы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 18:23 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
questioner, Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 18:24 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
questioner1<<20 это ведь будет 0...[39 штук] 10...[20 штук] и получится, что мы установили 40 бит вместо 20 Какая разница? Число никто не видит. А get так же сработает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 18:25 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
questionerили они с конца пронумерованы? А есть принципиальная разница? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 18:25 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
Blazkowiczquestionerили они с конца пронумерованы? А есть принципиальная разница? это объясняет почему используется сдвиг единицы влево. Для клиента класса разницы никакой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 18:26 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
questioner, Я прогнал. Сдвиг в Java не цикличиный. Просто при сдвиге не используются значения дальше размера типа. Для сдвига int только 5 бит, а для сдвига long только 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 18:30 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
Blazkowiczquestioner, Я прогнал. Сдвиг в Java не цикличиный. Просто при сдвиге не используются значения дальше размера типа. Для сдвига int только 5 бит, а для сдвига long только 6. а что подразумевается под размером типа?(а то у меня в голове цифры 32 и 64 бита соответственно) допустим прилетоло нам число 70. мы выяснили, что оно во втором long дальше идёт операция 1L<< 70 Код: java 1. 2. похож прям на цикличный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 18:37 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
questioner, Почитай определение операции сдвига в JLS. Размер int - 32 = 2^5 бита. То есть 5 бит достаточно чтобы адресовать номер бита в int. Поэтому для сдвига используется только 5 бит от значения указывающее на количество сдвигов. То есть 1L << 70 эквивалентно 1L << 6, потому что 64 это уже 7й бит в значении 70. Он не используется. Для long используется только 6 бит от числа справа (70). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2017, 19:45 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Подтверждается тем, что Код: java 1. 2. 3. 4. 5. возвращает одно и то же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2017, 00:11 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
questionerили они с конца пронумерованы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2017, 10:45 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
questionerПодтверждается тем, что ... возвращает одно и то же Правильно. JLS нам не указ. Эксперимент - наше всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2017, 10:55 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
BlazkowiczquestionerПодтверждается тем, что ... возвращает одно и то же Правильно. JLS нам не указ. Эксперимент - наше всё. Нельзя же никому на слово верить))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2017, 11:09 |
|
||
|
почему BitSet использует long[] размера 6
|
|||
|---|---|---|---|
|
#18+
questionerпохож прям на цикличный Похож но не ёж. Другими словами в качестве аргумента для количества бит на которые сдвигать неявным образом используется остаток от деления на максимальную размерность того числа которое указано. Другими словами сдвиг на 33 бита это тоже самое что сдвиг на 1. При циклическом сдвиге влево справа вылезает левый бит. При не циклическом, заранее установленный (0 или например знак отрицательного числа, если двигаем вправо). на примере int Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2017, 11:18 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39391896&tid=2123214]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
59ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 400ms |

| 0 / 0 |
