Принимая во внимание простую C, лучший способ -
inline void circular_left_shift(char *chars, short shift) {
__int32 *dword = (__int32 *)chars;
*dword = (*dword << shift) | (*dword >> (32 - shift));
}
Хм, char
имеет длину 16 битов, для меня неясно.Я предполагаю, что int
по-прежнему 32-разрядный.
inline void circular_left_shift(char *chars, short shift) {
int i, part;
part = chars[0] >> (16 - shift);
for (i = 0; i < 3; ++i)
chars[i] = (chars[i] << shift) | (chars[i + 1] >> (16 - shift));
chars[3] = (chars[3] << shift) | part;
}
Или вы можете просто развернуть этот цикл.
Вы можете углубиться в инструкцию asm ror
, на x86 он способен выполнятьтакое смещение до 31 бит осталось.Что-то вроде
MOV CL, 31
ROR EAX, CL