При компиляции под x32 __uint64_t-переменные не желает сдвигаться на 32 разряда, что не так?
Тут проблема очень хитрая. оба аргумента должны быть 64битные.
Например:
__int64 a = 1ull << 33; // сработает,
__int64 b = 1 << 33; // обнулится
В х32 в независимости от типа аргументов байтовый сдвиг всегда возвращает тип под размер регистра. Так что если значение уехало за х32 - то все, хотя ассемблерная вставка может помочь.