Цитата(zltigo @ Jan 6 2008, 05:47)

Главная ошибка - Вы начали использовать "нечто" пытающееся эмулировать дебильную бинарную запись при наличии в языках много более удобных средств, например, возможности поименовать биты. Разбираться (только зачем - правильнее не пользоваться) можете начинать с реализации этой самой 0b....
Потенциальная ошибка - препроцессор особым умом обычно особо не отличается, посему не не искушайте его и пользуйтесь не менее выразительным " <<( 8-3 )" а не "(<<8)>>3"
Примечание - разрядность констант не резиновая и по умолчанию чаще всего 16bit, посему нежели в будующем потребуется большая, то не забудте указать сие явно через 'L'.
C некоторой долей вероятности основываясь на типичных ошибках в реализации макросов на основе которых построено "нечто" можете попробовать:
T=(0b10001100) << (8-3);
И где тут хоть один макрос?
Кстати, >>(8-3) сработает, но по совсем другой причине.
Цитата(pimen @ Jan 6 2008, 05:02)

int T=0x0;
main ()
{
T=(0b10001100<<8)>>3;
}
это нечто выдает значение Т=0b1111000110000000, хотя должен 0b0001111000110000.
если заменить сдвиг право на 3 на деление на 0b1000, то результат все равно 0b1111000110000000.
деление и сдвиг просто числа 0b1000110000000000 дает правильные результаты.
что я не учел??????????
Проблема в том, что: а) стандарт Си не специфицирует, будет ли ">>" арифметическим сдвигом, или логическим; б) не специфицируется размер int'а, который в данном случае составляет 16 бит. В результате сдвига на 8 влево, 0b10001100 превращается в 0x8C00, которое содержит единицу в знаковом бите (типа это отрицательное число). Сдвиг вправо, который как оказалось, в данном случае арифметический, размазывает эту единицу по старшим битам числа чтобы сохранить отрицательность. В результате имеем то, что имеем.
При сдвиге "просто числа" 0b1000110000000000 такого не происходит, потому что данная реализация компилятора считает константы данного вида unsigned, и генерирует для них логический сдвиг.