Что такое 12345 >> 2 на самом деле делать арифметически?

Мой вопрос в следующем примере, что делает val = val >> 2; делать? То есть я считаю, что это деление на 4.

int val = 12345678;
val = val >> 2;

Вот предыстория этого вопроса.

У меня есть чтение с счетчика воды, скажем, 12345678. То, как работают наши счетчики воды, это две правые цифры, которые выбрасываются для чтения, поэтому 123456 - это действительно чтение. (Есть причины для исключения двух правых цифр, которые имеют отношение к тому, как поток воды заставляет регистры вращаться. Это, правда, не имеет никакого отношения к моему вопросу.)

В настоящее время мы берем 12345678 и делим его на 100, используя целочисленные переменные 4GL, поэтому я не получаю десятичное число. Мы получаем усечение, которого мы не ожидаем, и я пытаюсь определить, будет ли сдвиг битов лучше.

После того, как чтение усечено до 123456, дельта вычисляется с использованием последнего чтения (также усеченного), и из этого генерируется потребление.

У меня есть C, доступный для меня в Informix 4GL, и я считаю, что лучший способ удалить две младшие цифры - сдвинуть бит вправо на 2. Я полагаю, что это единственный способ получить, например, -

5 digit meter   12345 --> 123
6  "     "     123456 --> 1234
7  "     "    1234567 --> 12345

Спасибо за терпение упрощенного вопроса. Мы пытаемся выяснить, как программируются конечные точки, которые общаются с счетчиками, и что на самом деле означают данные, поступающие с конечных точек.

4 ответа

Решение

Сдвиг битов отбрасывает последние две двоичные цифры, а не десятичные цифры. Это эквивалентно целочисленному делению на четыре. Вам нужно делить int на 100, чтобы отбросить последние две десятичные цифры.

101111000110000101001110 bin = 12345678 dec

Корзина 101111000110000101001110 > > Корзина 2 декабря = 1011110001100001010011

1011110001100001010011 bin = 3086419 dec

'>>' выполняет операцию побитового сдвига.

Чтобы понять, что он делает, вы должны сначала преобразовать 12345678 в двоичный файл.

12345678 = 100101101011010000111

">>" означает, что вы сдвигаете каждый бит вправо, а в вашем примере - на 2 позиции. (<< сдвигается влево)

100101101011010000111 >> 2 = 001001011010110100001

Затем преобразуйте обратно в десятичное: 308641

В i4gl вы можете легко преобразовать цифры в CHAR, обрезать их [1,6], а затем вернуть обратно в INT.

РЕДАКТИРОВАТЬ: см. Преобразование типов в i4gl

12345678       : 101111000110000101001110
12345678 >> 2  : 1011110001100001010011
12345678 / 4   : 1011110001100001010011
Другие вопросы по тегам