у меня есть вопрос по этой теме, я думаю, что ответ неверный.
Поменять местами биты числа в 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, что вряд ли случайно произойдет.
Вы показали только 8 бит, что означает максимально возможное значение 2 8 -1, что соответствует 255.
3051 в двоичном формате: 1011 1110 1011, поэтому, чтобы получить это, вы, по-видимому, продублировали наименее значимый ниббл в третий ниббл.
Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.