向左旋转c中的算法二进制值

问题描述

我正尝试左旋转二进制值:

int left_side=0;
    for (int i = 0; i < n; i++)
    {         
        left_side = left_side | (  ( number & ( 1<<BITS-i )) >> (BITS+i+1)-n  );

    }

BITS表示二进制值的长度,n是旋转距离。
例如:1000,且n = 1表示解决方案将是:0001。

一些我无法理解的原因(从左到右),让我们以数字253为例,该数字在二进制序列中为11111101,n = 3(距离),这是我代码中的结果二进制序列是101(即5)。
为什么答案不是7?在此循环中我错过了什么? 谢谢。

解决方法

您要向左旋转特定n位的数字amount

因此,您必须使用n << amount将数字向左移动,并将左侧的位放在右侧。这是通过使用右移将[0-amount[位设置为[NUMBER_BITS-amount,NUMBER_BITS [`]来完成的。

例如,如果您的电话号码是uint32_t,则可以使用以下代码(或轻松地使其适应其他类型)。

uint32_t RotateLeft(uint32_t n,int amount)  { 
    return (n << amount)|(n >> (8*sizeof(uint32_t) - amount)); 
}
,

我认为有两种方法:

  1. 旋转1位n
  2. 仅旋转n % BITS位一次

旋转“结束”,因此我们可以将n的每个BITSth(第8个)倍数模为0,以防有人想旋转100次。我认为第二种方法更容易理解,实现和阅读,如果可以执行一次,为什么还要循环100次?

算法:

即使int is minimum 16 bits,我也将使用8位进行演示。原始MSB用点标记。

.11110000 rl 2 == 110000.11

发生了什么事? 2位向右,其余(BITS - 2)位向左。那就是左移和右移“组合”。

a = .11110000 << 2 == 110000.00
b = .11110000 >> (BITS - 2) == 000000.11
c = a | b
c == 110000.11

容易,不是吗?只需记住首先使用n % BITS并使用unsigned类型。

unsigned int rotateLeft(unsigned int number,int n) {
    n %= BITS;
    unsigned int left = number << n;
    unsigned int right = number >> (BITS - n);
    return left | right;
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...