免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: superroy
打印 上一主题 下一主题

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

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

循环右移的函数是什么?

原帖由 "飞灰橙" 发表:

为什么不用  sizeof(x)  代替?

short n;
n = -5;
rotl(n +2, 2);
就会出错

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

循环右移的函数是什么?

我说错了
应该是sizeof(x)*8
但是
  1. #define rotl(x,n) ((((x)<<(n))&(-(1<<(n))))|(((x)>;>;(sizeof(x)*8-(n)))&((1<<(n))-
  2. 1)))
  3. main()
  4. {
  5. short n;
  6. n = 32767;
  7. printf("%d, %x\n", n+2, rotl(n+2, 2));
  8. n += 2;
  9. printf("%d, %x\n", n, rotl(n, 2));
  10. }
复制代码

结果
32769, 20004
-32767, fffe0006
应该怎么来规定这个右移呢?

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

循环右移的函数是什么?

左移右移,都是以零补全其他的bit的,所以觉得&那部分代码就多余了,没有用
不过不知道这是C/C++的标准,还是不同的编译器有不同的实现。
我在g++3.2.3下是以零补全的。
所以觉得下面的就可以了

  1. #define rotlm(x,n) (((x)<<(n)) |((x)>;>;(32-(n))))
复制代码

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

循环右移的函数是什么?

为负数的时候右移补1

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

循环右移的函数是什么?

右移补的是符号位

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

循环右移的函数是什么?

原帖由 "yuxh" 发表:
结果
32769, 20004
-32767, fffe0006
应该怎么来规定这个右移呢?


感谢指出sizeof(x) * 8的问题.

现在这个宏可以任意位的左移了.
不过对rotl的第一个参数的宽度, 使用者必须自己心中有数.
如果不放心, 可以
rotl ((short)(n+2), 2)

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

循环右移的函数是什么?


  1. 为负数的时候右移补1
  2. 右移补的是符号位
复制代码

哦,原来是这样,谢谢了

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

循环右移的函数是什么?

to: yuxh
我觉得变量的溢出问题最好应该由程序员自己来控制。

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

循环右移的函数是什么?

右移应该是这样吧:
  1. #define rotr(x,n) ((((x)>;>;(n))&((1<<(sizeof(x)*8-(n)))-1)))|(((x)<<(sizeof(x)*8-(n)))&(-(1<<(sizeof(x)*8-(n)))))
复制代码

论坛徽章:
0
20 [报告]
发表于 2011-07-09 16:05 |只看该作者
本帖最后由 stevenliu1970 于 2011-07-09 16:08 编辑

回复 10# 飞灰橙


    根据各位大狭的指引,我修改了上述宏如下,x可以是int,long double任何类型:

左循环
#define rotl(x,n) ((((x)<<(n))&(-(1<<(n))))|(((x)>>(sizeof(x)*8-n))&((1<<(n))-1)))

右循环
#define rotr(x,n) ((((x)>>(n))&((1<<(sizeof(x) * )-1))|(x<<(sizeof(x)*8-n)))
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP