免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 16303 | 回复: 19
打印 上一主题 下一主题

[函数] 循环右移的函数是什么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-01-07 16:53 |只看该作者 |倒序浏览
在windows下用C++ builder,使用_rotl()和_rotr(),只实现了简单的移位,即填充位补0,而没有实现循环移位。
在我这边的AIX.4.3.3的stdlib.h头文件中,根本就没有找到这两个函数。

论坛徽章:
0
2 [报告]
发表于 2005-01-07 17:56 |只看该作者

循环右移的函数是什么?

write by yourself
a good training to improve your programming skill

论坛徽章:
0
3 [报告]
发表于 2005-01-08 19:34 |只看该作者

循环右移的函数是什么?

thank you.
i think it is not a difficult thing for me or any one here to write such a function.
but i just want to know the function provided by C\C++.

论坛徽章:
0
4 [报告]
发表于 2005-01-09 19:39 |只看该作者

循环右移的函数是什么?

好像没有提供相应的函数吧


  1. const int BITS=8;
  2. template <typename T>;
  3. void rotl(T &p,int len)
  4. {
  5.     T temp=1<<(sizeof(T)*BITS-1);   
  6.     for(int i=0; i<len; i++)   
  7.     if ((temp & p) == temp)
  8.             p=p<<1 | 0x1;        
  9.         else
  10.             p<<=1;
  11. };

  12. template <typename T>;
  13. void rotr(T &p,int len)
  14. {
  15.     T temp=1<<(sizeof(T)*BITS-1);  
  16.     for(int i=0; i<len; i++)
  17.     if ((0x1 & p) == 0x1)   
  18.         p=p>;>;1 | temp;   
  19.     else
  20.         p>;>;=1;
  21. };
复制代码

论坛徽章:
0
5 [报告]
发表于 2005-01-09 19:47 |只看该作者

循环右移的函数是什么?

网上找到一个很强的宏!
4个字节的。

  1. #define rotl(x,n) ((((x)<<(n))&(-(1<<(n))))|(((x)>;>;(32-(n)))&((1<<(n))-1)))

  2.   unsigned int i=0xabcdef12;
  3.     printf("%lx\n",i);
  4.     i=rotl(i,4);
  5.     printf("%lx\n",i);
复制代码

论坛徽章:
0
6 [报告]
发表于 2005-01-09 21:40 |只看该作者

循环右移的函数是什么?

改了一下,晕,原来不用一位一位的移的,太懒了。

感觉那个宏有部分表达式没有用啊……

  1. const int BITS=8;
  2. template <typename T>;
  3. T rotl(T p,int len)
  4. {
  5.     return (p>;>;(sizeof(T)*BITS-len)) | (p<<len);  
  6. };

  7. template <typename T>;
  8. T rotr(T p,int len)
  9. {
  10.     return (p<<(sizeof(T)*BITS-len)) | (p>;>;len) ;   
  11. };
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2005-01-10 10:15 |只看该作者

循环右移的函数是什么?

原帖由 "ningzhiyu" 发表:
感觉那个宏有部分表达式没有用啊……

哪个地方没用了?
#define rotl(x,n) ((((x)<<(n))&(-(1<<(n))))|(((x)>;>;(32-(n)))&((1<<(n))-1)))
(x)<<(n)    ==>; x左移n位
&(-(1<<(n))) ==>;和11...100000(n个0)相与
以上将原n低32-n位移至高位,后补0

((x)>;>;(32-(n))  ==>;x右移32-n位
&((1<<(n))-1) ==>;和00...0111..11(n个1)相与
以上将原n高n位移至低位,左补0

两个结果|,得到最后的循环右移结果

感觉就是32用得不好,限制x为一个32位数(long或32位系统的int)了

论坛徽章:
0
8 [报告]
发表于 2005-01-10 10:20 |只看该作者

循环右移的函数是什么?

多谢ningzhiyu。

论坛徽章:
0
9 [报告]
发表于 2005-01-10 10:22 |只看该作者

循环右移的函数是什么?

还想问一下,宏的哪个部分没有用上啊?我怎么觉得都有用啊,前一部分相当于移位,后一部分将移出的部分补回到尾部啊。

论坛徽章:
0
10 [报告]
发表于 2005-01-10 11:14 |只看该作者

循环右移的函数是什么?

原帖由 "yuxh" 发表:
感觉就是32用得不好,限制x为一个32位数(long或32位系统的int)了


为什么不用  sizeof(x)  代替?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP