标题:把高位移出放在低位。
只看楼主
kuaisha
Rank: 2
等 级:论坛游民
帖 子:120
专家分:30
注 册:2016-8-3
结帖率:100%
 问题点数:0 回复次数:6 
把高位移出放在低位。
第五题的答案是不是不对啊?怎么我输入2和1竟然不是3。2的二进制是10,1的是01,那么左移然后把高位的移到低位不应该是二进制11吗,也就是十进制3啊,我的为什么是4?
程序代码:
 5.编写一个函数,该函数将一个unsigned int中的所有位向左旋转指定数量的位。例如,rotate_l(x,4)将x中的所有位向左移动4个位置,而且从左端丢失的位会重新出现在右端。也就是说,把从高位移出的位放入低位。在程序中测试该函数。




#include <stdio.h>

int rotate_l(unsigned int number, unsigned int bit);

int main(void)
{

 unsigned int number, bit;

 printf("input a hexadecimal number and rotated bits number (q to quit):");

 while( scanf("%x%d", &number, &bit) == 2 )

 {
  printf("%x rotate %d bit left : %x\n",  number, bit, rotate_l(number, bit));
  printf("input a number(q to quit):");

 }

 printf("quit\n");


 return 0;
}

int rotate_l(unsigned int number, unsigned int bit)
{

 unsigned int i;

 unsigned int hign = 8 * sizeof(unsigned int);//最高位
 for (i=0; i<bit; i++)
  if( number&( 1<<(hign-1) ) ) number = (number << 1) | 1;
  else number = number << 1;

 return number;
}
搜索更多相关主题的帖子: 高位 unsigned int number bit 
2018-11-18 08:21
kfyniriu
Rank: 6Rank: 6
等 级:侠之大者
威 望:9
帖 子:105
专家分:426
注 册:2018-7-6
得分:0 
十进制2在机器中对应的二进制码为 0000 0000 0000 0010

而不是你认为的 10

左移一位 对应的二进制码为: 0000 0000 0000 0100

给一个参考的代码

#include<stdio.h>

int main()
{

    int i = 2, j, k;
    for(j = 0; j < 4; j++)
    {
        k = i;
        i = (i << 1) | (k >> sizeof(k) * 4 - 1);
        printf("%d\n",i);
    }
    return 0;
}
2018-11-18 12:21
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
if( number&( 1<<(hign-1) ) ) number = (number << 1) | 1;
这句中的 (1<<(hign-1))好象也有问题,没变动
2018-11-19 05:28
kuaisha
Rank: 2
等 级:论坛游民
帖 子:120
专家分:30
注 册:2016-8-3
得分:0 
回复 2楼 kfyniriu
sizeof(k) * 4 - 1,您这个是什么意思,没看懂为什么这么做?
2018-11-20 07:45
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
程序代码:
unsigned rotate_l( unsigned number, unsigned bit )
{
    size_t UINT_BIT = sizeof(number) * CHAR_BIT;
    bit %= UINT_BIT;
    return (number<<bit) | (number>>(UINT_BIT-bit));
}
2018-11-20 08:54
kfyniriu
Rank: 6Rank: 6
等 级:侠之大者
威 望:9
帖 子:105
专家分:426
注 册:2018-7-6
得分:0 
回复 4楼 kuaisha
抱歉,自己搞错了,应该是sizeof(k)*8-1
严谨的写法是5楼大神的 sizeof(k)*CHAR_BIT-1  头文件(#include <limits.h>)

[此贴子已经被作者于2018-11-20 09:22编辑过]

2018-11-20 09:20
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
关键是“向左旋转指定数量的位”,“旋转”的意思是不是:相当于把最高位与最低位连接成一个环滚动指定数量的位。
2018-11-20 11:35



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-491347-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.217693 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved