у меня есть вопрос по этой теме, я думаю, что ответ неверный.
Поменять местами биты числа в C
1110 1011 это равно 235, но я получаю 3051 почему?
у меня есть вопрос по этой теме, я думаю, что ответ неверный.
Поменять местами биты числа в C
1110 1011 это равно 235, но я получаю 3051 почему?
Десятичное значение 3051
равно 101111101011
в двоичном. Если вы разделите его на четыре битных сегмента следующим образом: 1011 1110 1011
, вы увидите, что четыре младших бита повторяются над восемью битами, которые вы хотите. Причина в том, что вы не замаскировали значение, которое должно быть верхними четырьмя битами.
Итак, вместо чего-то вроде этого:
(c >> 4) | ((c & 0x0f) << 4)
или что-то вроде этого:
((c >> 4) | (c << 4)) & 0xff
у вас просто есть это:
(c >> 4) | (c << 4)
Скорее всего, у вас действительно правильный номер, но вы используете %d
для его печати без преобразования в int (или что-то еще забавное в том, как вы его отображаете).
Я говорю это потому, что (3051 & 235) == 235
, что вряд ли случайно произойдет.
int
не принесет никакой пользы - 3051 поместится в int
. Чтобы сделать что-нибудь хорошее, вам нужно преобразовать в unsigned char
(и это подозрительно - код, который производит 3051, где 235 предназначен, очевидно, необходимо исправить, а не возиться, по крайней мере, IMO).
- person Jerry Coffin; 29.06.2010
Вы показали только 8 бит, что означает максимально возможное значение 2 8 -1, что соответствует 255.
3051 в двоичном формате: 1011 1110 1011, поэтому, чтобы получить это, вы, по-видимому, продублировали наименее значимый ниббл в третий ниббл.