Почему арифметический сдвиг halfs число только в НЕКОТОРЫХ инцидентах?

Эй, я - самообучение о поразрядном, и я видел где-нибудь в Интернете что арифметический сдвиг (>>) одним halfs число. Я хотел протестировать его:

44 >> 1 returns 22, ok
22 >> 1 returns 11, ok
11 >> 1 returns 5, and not 5.5, why?

Другой пример:

255 >> 1 returns 127
127 >> 1 returns 63 and not 63.5, why?

Спасибо.

7
задан Alon Gubkin 25 February 2010 в 16:00
поделиться

5 ответов

Оператор битового сдвига фактически не делит на 2. Вместо этого он перемещает биты числа вправо на количество позиций, указанных в справа. Например:

00101100 = 44
00010110 = 44 >> 1 = 22

Обратите внимание, что биты во второй строке такие же, как и в строке выше, просто сдвинут на одну позицию вправо. Теперь посмотрим на второй пример:

00001011 = 11
00000101 = 11 >> 1 = 5

Это точно такая же операция, как и раньше. Однако результат 5 обусловлен тем, что последний бит сдвигается вправо и исчезает, создавая результат 5. Из-за такого поведения оператор сдвига вправо обычно эквивалентен делению на два с последующим отбрасыванием любой остаток или десятичная часть.

13
ответ дан 6 December 2019 в 12:48
поделиться

Стандартный способ состоит в том, чтобы посмотреть на ваши требования и сохранить требуемые данные. Хотя это интересная академическая проблема, правда в том, что в десятках систем, над которыми я работал, имя и фамилия обычно достаточны. Иногда мы будем хранить средний начальный, но большую часть времени даже это не требуется.

Если у вас есть требование хранить все доктора Джона Квинта Максимуса Public-Doe III Ph.D. ДОКТОР МЕДИЦИНЫ. Информация RPh, затем вы придумываете место хранения для этого. Но пока ваша фамилия позволяет достаточно данных, тогда доктор Максимус может набрать столько или меньше, сколько он хотел бы хранить о своем имени и титулах.

-121--2924994-

Что здесь означает «ваш конфигурационный файл»?

Файл конфигурации вашего репо, найденный по адресу .git/config в корне вашего репо. (Имеется также файл глобального конфигурационного элемента для каждого пользователя по адресу ~/.gitconfig , но вы не хотите помещать в него параметры настройки репо.)

Какой файл следует редактировать, и в какую именно строку ввести?

Вы можете использовать программу git config для записи конфигурационной информации вместо ввода вручную. Однако если вы хотите сделать это вручную, просто откройте .git/config - синтаксис довольно простой.

Какое прозвище в данном случае?

Прозвище, в данном случае, является именем пульта - так «палка». Вам не нужно беспокоиться о параметрах remote. * , поскольку они уже были набором, но необходимо установить параметры branch. * . Эти опции указывают Git, что объединять при выполнении git тянуть из палки.

Скажите, что вы хотите слиться в главном из палочки при выполнении git тянуть из палки. Вы можете сделать это так:

# Sets stick as default remote for git pull.
# Note that origin will no longer be the default remote for git pull!
$ git config branch.master.remote stick

# Automatically merge in stick's master branch when doing a git pull
$ git config branch.master.merge refs/heads/master

Так что теперь, когда вы делаете git pull без какой-либо удаленной или рефспек-информации, он извлекает все ветви из палки, и сливаются в главную ветвь палки. Обратите внимание, что источник больше не будет удаленным по умолчанию; для объединения в главной ветви источника необходимо использовать git pull origin master .

Если вы не хотите изменять используемый по умолчанию пульт дистанционного управления, вам придется продолжить использование git pull stick master .

-121--2557654-

Двоичный не имеет понятия десятичных чисел. Он возвращает усеченное (int) значение.

11 = 1011 в двоичном формате. Переместите вправо, и у вас будет 101, что равно 5 в десятичном выражении.

1
ответ дан 6 December 2019 в 12:48
поделиться

В большинстве статически типизированных языков возвращаемый тип операции равен, например, "int". Это исключает дробный результат, подобно целочисленному делению.

(Есть более точные ответы о том, что находится "под капотом", но вам не нужно понимать их, чтобы понять основы системы типов)

.
0
ответ дан 6 December 2019 в 12:48
поделиться

Мне кажется, что данные, вводимые в базу данных, являются utf8. Чтобы поместить это в таблицу, его необходимо преобразовать в latin1 (так как это - набор символов столбца), и это может дать один до трех latin1 символов.

Пекка просто побил меня до этого - его решение должно работать на решение этой проблемы.

-121--4903669-

11 в двоичном формате равно 1011

11 >> 1 

означает, что двоичное представление смещается вправо на один шаг.

1011 >> 1 = 101

Тогда у вас есть 101 в двоичном виде, который 1 * 1 + 0 * 2 + 1 * 4 = 5.
Если бы вы сделали 11 > > 2 , вы бы в результате 10 в двоичном, т.е. 2 (1 * 2 + 0 * 1).

Смещение по 1 вправо преобразует сумму (A_i*2^i) [i = 0.. n] в сумму (A_ (i + 1) * 2 ^ i) [i = 0.. n-1] Вот почему, если ваше число четное (т.е. A_0 = 0), оно делится на два. (извините за настроенный синтаксис XX...:))

-121--3866155-

Сдвиг битов совпадает с делением или умножением на 2 ^ n. В целочисленной арифметике результат округляется в сторону нуля до целого числа. В арифметике с плавающей запятой смещение битов не допускается.

Внутреннее смещение битов, ну, сдвигает биты, и округление просто означает, что биты, которые падают с края, просто удаляются (не то, что он фактически вычисляет точное значение и затем округляет его). Новые биты, которые появляются на противоположном краю, всегда являются нулями для правой стороны и для положительных значений. Для отрицательных значений один бит добавляется в левой части, так что значение остается отрицательным (см. как работает дополнение два ), и использованное мною арифметическое определение остается верным.

0
ответ дан 6 December 2019 в 12:48
поделиться

11 в двоичном формате равно 1011

11 >> 1 

означает, что вы сдвигаете двоичное представление вправо на один шаг.

1011 >> 1 = 101

Тогда у вас есть 101 в двоичном формате, что составляет 1 * 1 + 0 * 2 + 1 * 4 = 5.
Если бы вы сделали 11 >> 2 , у вас было бы в результате 10 в двоичном формате, т.е. 2 (1 * 2 + 0 * 1).

Сдвиг на 1 вправо преобразует сумму (A_i * 2 ^ i) [i = 0..n] в сумму (A_ (i + 1) * 2 ^ i) [i = 0..n-1] поэтому, если ваше число четное (например, A_0 = 0), оно делится на два. (извините за измененный синтаксис LateX ... :))

2
ответ дан 6 December 2019 в 12:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: