如何解决向左旋转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位
n
次 - 仅旋转
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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。