1. #include <stdio.h>
  2. /*
  3. _lrotr()将一个无符号长整形数左循环移位的函数
  4. 原形:unsigned long _lrotr(unsigned long value,int count)
  5. 功能:将value向左循环移动count位。
  6. 返回值:将value向左循环移动count位后的值。
  7. 头文件:stdlib.h
  8. */
  9. unsigned _rotl (unsigned val,int shift)
  10. {
  11. register unsigned hibit; /* non-zero means hi bit set */
  12. register unsigned num = val; /* number to rotate */
  13. shift &= 0x1f; /* modulo 32 -- this will also make
  14. negative shifts work */
  15. while (shift--) {
  16. hibit = num & 0x80000000; /* get high bit */
  17. num <<= 1; /* shift left one bit */
  18. if (hibit)
  19. num |= 1; /* set lo bit if hi bit was set */
  20. }
  21. return num;
  22. }
  23.  
  24. //这个函数就是将_rotl函数做再次封装
  25. unsigned long _lrotl (unsigned long val,int shift)
  26. {
  27. return( (unsigned long) _rotl((unsigned) val, shift) );
  28. }
  29. /*
  30. _lrotr()将一个无符号长整形数右循环移位的函数
  31. 原形:unsigned long _lrotr(unsigned long value,int count)
  32. 功能:将value向右循环移动count位。
  33. 返回值:将value向右循环移动count位后的值。
  34. 头文件:stdlib.h
  35. */
  36. unsigned _rotr (unsigned val,int shift)
  37. {
  38. register unsigned lobit; /* non-zero means lo bit set */
  39. register unsigned num = val; /* number to rotate */
  40.  
  41. shift &= 0x1f; /* modulo 32 -- this will also make
  42. negative shifts work */
  43. while (shift--) {
  44. lobit = num & 1; /* get high bit */
  45. num >>= 1; /* shift right one bit */
  46. if (lobit)
  47. num |= 0x80000000; /* set hi bit if lo bit was set */
  48. }
  49. return num;
  50. }
  51. //对右移函数做再次封装
  52. unsigned long _lrotr (unsigned long val,int shift)
  53. {
  54. return( (unsigned long) _rotr((unsigned) val, shift) );
  55. }
  56.  
  57. int main(void)
  58. {
  59. unsigned long val = 2;
  60. unsigned long ret = _lrotl(val , 4) ;
  61. printf("%d\n",ret);
  62. unsigned long r = _lrotr(ret,4);
  63. printf("%d\n",r);
  64. return 0 ;
  65. }

运行结果:32 2

C库源码中的移位函数的更多相关文章

  1. 从源码中无法看出函数所在的js脚本的解决方法

    通过设置断点调试使js脚本自动出现

  2. Generator函数执行器-co函数库源码解析

    一.co函数是什么 co 函数库是著名程序员 TJ Holowaychuk 于2013年6月发布的一个小工具,用于 Generator 函数的自动执行.短小精悍只有短短200余行,就可以免去手动编写G ...

  3. 自定义函数hello,并注册到hive源码中并重新编译

    1 编写自己的udf方法hello package cn.zhangjin.hive.udf; import org.apache.hadoop.hive.ql.exec.Description; i ...

  4. 在Android源码中查找Java代码中native函数对应的C++实现

    Android源码中很多关键代码都是C++实现的,java通过jni来调用,经常会看到java中这样的代码: static native Thread currentThread(); 如何根据方法名 ...

  5. 曹工说Redis源码(4)-- 通过redis server源码来理解 listen 函数中的 backlog 参数

    文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis,而怎么才能懂,光看是不够的,建议跟着下面的这一篇,把环境搭建起来,后续可以自己阅读源码,或者跟着我这边一起阅读.由于 ...

  6. SequoiaDB 系列之五 :源码分析之main函数

    好久好久没有写博客了,因为一直要做各种事,工作上的,生活上的,这一下就是半年. 时光如梭. 这两天回头看了看写的博客,感觉都是贻笑大方. 但是还是想坚持把SequoiaDB系列写完. 初步的打算已经确 ...

  7. Android 源码中的设计模式

    最近看了一些android的源码,发现设计模式无处不在啊!感觉有点乱,于是决定要把设计模式好好梳理一下,于是有了这篇文章. 面向对象的六大原则 单一职责原则 所谓职责是指类变化的原因.如果一个类有多于 ...

  8. jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理

    jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理 最近在看jquery源码分析的视频教学,希望将视频中学到的知识用博客记录下来,更希望对有同样对jquery源码有困惑 ...

  9. jQuery源码中的“new jQuery.fn.init()”什么意思?

    所有文章搬运自我的个人主页:sheilasun.me 引子 最近打算试试看看jQuery的源码,刚开个头就卡住了.无论如何都理解不了jQuery源码入口部分中的 return new jQuery.f ...

随机推荐

  1. [USACO17FEB]Why Did the Cow Cross the Road II S

    题目描述 The long road through Farmer John's farm has  crosswalks across it, conveniently numbered  (). ...

  2. poj 2653 线段与线段相交

    Pick-up sticks Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 11884   Accepted: 4499 D ...

  3. vim配置文件和插件管理

    本文通过总结零碎的资料总结而成,更多是去引导学习vim配置文件及插件使用. .vimrc配置文件,内容如下(备注清晰) "引入插件pathogen使用 execute pathogen#in ...

  4. linux退出状态码及exit命令

    Linux提供了一个专门的变量$?来保存上个已执行命令的退出状态码.对于需要进行检查的命令,必须在其运行完毕后立刻查看或使用$?变量.它的值会变成由shell所执行的最后一条命令的退出状态码: [ro ...

  5. WPF 实现换肤功能

    将所有控件的基本样式汇集到一个资源字典中,构成界面的基本样式文件,然后进行不同颜色皮肤的定制. 即在新的皮肤资源字典文件中引入基本样式文件,然后使用资源继承,并且只设置控件的颜色属性等,形成一个皮肤文 ...

  6. day5 liaoxuefeng---virtualenv、图形界面、网络编程、电子邮件

    一.virtualenv 二.图形界面 三.网络编程 四.电子邮件

  7. Python作业之工资管理

    作业之工资管理 工资管理实现要求: 工资管理系统 Alex 100000 Rain 80000 Egon 50000 Yuan 30000 -----以上是info.txt文件----- 实现效果: ...

  8. linux修改root账户的用户名所得的教训

    之前linux服务器的密码被别人改过, 然后叫服务器相关的负责人重置了root账户(服务器负责人在客户所在公司), 重置好之后, 领导叫更改下root 用户名和密码, 于是我二话不说就开始找方法, 找 ...

  9. jquery easyui combobox 从指定位置开始模糊查询

    $("#bzr").combobox({ url: "ClassSave.aspx?opt=bzr&bzr=<%=arrbj[2]%>", ...

  10. vuex存储和本地存储(localstorage、sessionstorage)的区别

    1.最重要的区别:vuex存储在内存,localstorage则以文件的方式存储在本地 2.应用场景:vuex用于组件之间的传值,localstorage则主要用于不同页面之间的传值. 3.永久性:当 ...