Блог пользователя Astekinane

Автор Astekinane, 12 лет назад, По-русски

Можно ли как-то быстро побитово циклически сдвинуть первые N битов массива лонг лонгов на k позиций вправо при помощи ассемблерных вставок?

  • Проголосовать: нравится
  • +9
  • Проголосовать: не нравится

»
12 лет назад, # |
Rev. 3   Проголосовать: нравится +6 Проголосовать: не нравится

Ох, не советую с этим заморачиваться... Вот код, правда не для первых N битов, а для всего массива, не для long long, а для int, неправильно работающий при k > 32 и вообще написанный быдлокодером, то есть мной :).

void arrshift(int *arr, int length, char k) {
	int prev = arr[length - 1];
	for (int *p = arr; p < arr + length; p++) {
		prev = *p;
		__asm {
			mov edx, p
			mov eax, prev
			mov ebx, [edx]
			mov cl, k
			shrd ebx, eax, cl
			mov [edx], ebx
		}
	}
}

UPD. Очевидно, код написан под MSVC++.

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +13 Проголосовать: не нравится

    Сдается мне что эта конструкция тормозить будет еще больше чем чистый С. Уж если переводить в ассемблер так целиком цикл.

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Возможно. Я написал этот код тупо для того, чтобы показать автору логику использования инструкции shrd, а если он захочет это доводить до ума — это уже его дело. Хотя я бы на его месте забил.

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

А в чем конкретно проблема? Непонятно, что значит быстро. Быстрее чем тривиальным образом?