Ваш запрос, по-видимому, состоит в том, чтобы «повернуть» целое число «Влево», «n» количество раз, но сохранить «бит знака» (MSB), если установлено.
Одно из решений будет ... ...
#include <stdio.h>
#define INT_BITS 32
int arithLeftShift(int x, int n) {
int res;
res = (x << n | (x >> (INT_BITS - n) & ~(~0 << n))) | x & (~0 << (INT_BITS - 1));
return res;
}
int main(){
int x = 0x87654321;
int n = 4;
printf("0x%x\n",arithLeftShift(x,n));
}
Объяснение:
Сдвиг влево x, n раз - последние n битовноль.
(x >> (INT_BITS - n) & ~ (~ 0 << n)) </p>
Сдвиг вправо x (INT_BITS - n) раз для установки первых n битов висправьте положение и введите «И» с помощью ~ (~ 0 << n), чтобы установить верхние биты в ноль. Это позаботится о «расширении знака», если оно есть. </p>
(x << n | (x >> (INT_BITS - n) & ~ (~ 0 << n))) </p>
«ИЛИ» для выполнения операции «Повернуть влево».
- x & (~ 0 << (INT_BITS - 1) </li>
Сдвиг влево «-1», 31 раз и «И» с помощью x, чтобы проверить, установлено ли значение MSB для x.
(x << n | (x >> (INT_BITS - n) & ~ (~ 0 << n))) | x & (~ 0 << (INT_BITS - 1)) </p>
Наконец "ИЛИ"Приведенные выше выражения, чтобы получить ваш ответ.