1 Востаннє редагувалося vector9 (14.04.2015 15:47:53)

Тема: Уривок з thinking in java

як зрозуміти цей абзац(Розділ про оператори, оператори зсуву)?

Если сдвигаемое значение относится к типу char, byte или short, эти типы приводятся к int перед выполнением сдвига, и результат также получится int. При этом используется только пять младших битов с «правой» стороны. Таким образом, нельзя сдвинуть битов больше, чем вообще существует для целого числа int. Если вы проводите операции с числами long, то получите результаты типа long. При этом будет задействовано только шесть младших битов с «правой» стороны, что предотвращает использование излишнего числа битов.

Що мається на увазі, отут?

При этом используется только пять младших битов с «правой» стороны.

2

Re: Уривок з thinking in java

Може, перекладачі чудять? Схоже на 2^5 і 2^6 замість 5 і 6.

Подякували: koala1

3 Востаннє редагувалося vector9 (14.04.2015 16:16:48)

Re: Уривок з thinking in java

от дивлюся на оригінал і там теж таке, еккель гонить собі :)

If you shift a char, byte, or short, it will be promoted to int before the shift takes place, and
the result will be an int. Only the five low-order bits of the right-hand side will be used. This
prevents you from shifting more than the number of bits in an int. If you’re operating on a
long, you’ll get a long result. Only the six low-order bits of the right-hand side will be used,
so you can’t shift more than the number of bits in a long.

4

Re: Уривок з thinking in java

В'їхав. Мається на увазі той факт, що зсув на 33 (100001) еквівалентний зсуву на 1, про що я не знав, звісно ж.

Подякували: vector9, P.Y., koala, volodimirg4

5

Re: Уривок з thinking in java

Точно!
Ключовий момент

of the right-hand side

уважність і ще раз уважність :)
ми так часто про неї забуваємо

6

Re: Уривок з thinking in java

Цікаво. Як виявилось, подібну особливість також має perl і php, а python (що працює з безрозмірними числами) робить зсув на задану кількість розрядів, збільшуючи кількість байтів числа до потрібного розміру.

У мові C (не знаю, наскільки це працює для всіх компіляторів та систем — використовував gcc 4.6.2 для MinGW) результат операції зі змінними й константами може відрізнятись:
[code=c]#include <stdio.h>
int main()
    {
    int n=33;
    printf("%d\n", 1<<n);
    printf("%d\n", 1<<33);   
    }
/* вивід:
2
0
*/
[/code]