По какой причине языки высокого уровня, такие как C # / Java, маскируют операнд счетчика битовых сдвигов?
Это скорее дизайн языка, а не вопрос программирования.
Ниже приводится выдержка изJLS 15.19 Операторы сдвига:
Если повышенный тип левого операндаint
только пять младших битов правого операнда используются в качестве расстояния сдвига.
Если повышенный тип левого операндаlong
тогда только шесть младших битов правого операнда используются в качестве расстояния сдвига.
Такое поведение такжеуказано в C #и хотя я не уверен, что это в официальной спецификации для Javascript (если есть), это также верно, по крайней мере, на основе моего собственного теста.
Следствием этого является следующее:
(1 << 32) == 1
Я понимаю, что эта спецификация, вероятно, «вдохновлена» тем фактом, что базовое оборудование берет только 5 бит для операнда подсчета при сдвиге 32-битных значений (и 6 бит для 64-битной), и я могу понять такое поведение, указанное в Например, уровень JVM, но почему языки высокого уровня, такие как C # и Java, сохраняют это довольно низкое поведение? Разве они не должны обеспечивать более абстрактное представление помимо аппаратной реализации и вести себя более интуитивно? (Еще лучше, если они могут принять отрицательный счет, чтобы означать сдвиг в ДРУГОМ направлении!)