вопрос о битах подкачки

у меня есть вопрос по этой теме, я думаю, что ответ неверный.

Поменять местами биты числа в C

1110 1011 это равно 235, но я получаю 3051 почему?


person dato datuashvili    schedule 29.06.2010    source источник
comment
Вы используете 8-битный беззнаковый символ? Вы не должны этого делать, поскольку в качестве ответа вы получаете 3051. Как упоминалось в комментарии, код будет работать только с 8-битным типом данных.   -  person Pace    schedule 29.06.2010


Ответы (3)


Десятичное значение 3051 равно 101111101011 в двоичном. Если вы разделите его на четыре битных сегмента следующим образом: 1011 1110 1011, вы увидите, что четыре младших бита повторяются над восемью битами, которые вы хотите. Причина в том, что вы не замаскировали значение, которое должно быть верхними четырьмя битами.

Итак, вместо чего-то вроде этого:

(c >> 4) | ((c & 0x0f) << 4)

или что-то вроде этого:

((c >> 4) | (c << 4)) & 0xff

у вас просто есть это:

(c >> 4) | (c << 4)
person Guffa    schedule 29.06.2010

Скорее всего, у вас действительно правильный номер, но вы используете %d для его печати без преобразования в int (или что-то еще забавное в том, как вы его отображаете).

Я говорю это потому, что (3051 & 235) == 235, что вряд ли случайно произойдет.

person Mark Rushakoff    schedule 29.06.2010
comment
Преобразование в int не принесет никакой пользы - 3051 поместится в int. Чтобы сделать что-нибудь хорошее, вам нужно преобразовать в unsigned char (и это подозрительно - код, который производит 3051, где 235 предназначен, очевидно, необходимо исправить, а не возиться, по крайней мере, IMO). - person Jerry Coffin; 29.06.2010

Вы показали только 8 бит, что означает максимально возможное значение 2 8 -1, что соответствует 255.

3051 в двоичном формате: 1011 1110 1011, поэтому, чтобы получить это, вы, по-видимому, продублировали наименее значимый ниббл в третий ниббл.

person Jerry Coffin    schedule 29.06.2010