Что такое 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