分享两个C库源码中的移位函数

简介: 分享两个C库源码中的移位函数

以下源代码是之前阅读C库代码获取的,分享一下:


  • _lrotr()将一个无符号长整形数左循环移位的函数
  • 原形:unsigned long _lrotr(unsigned long value,int count)
  • 功能:将value向左循环移动count位。
  • 返回值:将value向左循环移动count位后的值。
  • 头文件:stdlib.h
unsigned _rotl (unsigned val,int shift)
{
        register unsigned hibit;        /* non-zero means hi bit set */
        register unsigned num = val;    /* number to rotate */
        shift &= 0x1f;                  /* modulo 32 -- this will also make
                                           negative shifts work */
        while (shift--) {
                hibit = num & 0x80000000;  /* get high bit */
                num <<= 1;              /* shift left one bit */
                if (hibit)
                        num |= 1;       /* set lo bit if hi bit was set */
        }
        return num;
}
//这个函数就是将_rotl函数做再次封装
unsigned long _lrotl (unsigned long val,int shift)
{
        return( (unsigned long) _rotl((unsigned) val, shift) );
}
  • _lrotr()将一个无符号长整形数右循环移位的函数
  • 原形:unsigned long _lrotr(unsigned long value,int count)
  • 功能:将value向右循环移动count位。
  • 返回值:将value向右循环移动count位后的值。
  • 头文件:stdlib.h
unsigned _rotr (unsigned val,int shift)
{
        register unsigned lobit;        /* non-zero means lo bit set */
        register unsigned num = val;    /* number to rotate */
        shift &= 0x1f;                  /* modulo 32 -- this will also make
                                           negative shifts work */
        while (shift--) {
                lobit = num & 1;        /* get high bit */
                num >>= 1;              /* shift right one bit */
                if (lobit)
                        num |= 0x80000000;  /* set hi bit if lo bit was set */
        }
        return num;
}
//对右移函数做再次封装
unsigned long _lrotr (unsigned long val,int shift)
{
        return( (unsigned long) _rotr((unsigned) val, shift) );
}

简单对以上两个核心函数进行测试,测试环境基于DevC++:

#include <stdio.h>
unsigned _rotl (unsigned val,int shift)
{
        register unsigned hibit;        /* non-zero means hi bit set */
        register unsigned num = val;    /* number to rotate */
        shift &= 0x1f;                  /* modulo 32 -- this will also make
                                           negative shifts work */
        while (shift--) {
                hibit = num & 0x80000000;  /* get high bit */
                num <<= 1;              /* shift left one bit */
                if (hibit)
                        num |= 1;       /* set lo bit if hi bit was set */
        }
        return num;
}
//这个函数就是将_rotl函数做再次封装
unsigned long _lrotl (unsigned long val,int shift)
{
        return( (unsigned long) _rotl((unsigned) val, shift) );
}
unsigned _rotr (unsigned val,int shift)
{
        register unsigned lobit;        /* non-zero means lo bit set */
        register unsigned num = val;    /* number to rotate */
        shift &= 0x1f;                  /* modulo 32 -- this will also make
                                           negative shifts work */
        while (shift--) {
                lobit = num & 1;        /* get high bit */
                num >>= 1;              /* shift right one bit */
                if (lobit)
                        num |= 0x80000000;  /* set hi bit if lo bit was set */
        }
        return num;
}
//对右移函数做再次封装
unsigned long _lrotr (unsigned long val,int shift)
{
        return( (unsigned long) _rotr((unsigned) val, shift) );
}
int main(void)
{
    unsigned long val = 2;
    unsigned long ret = _lrotl(val , 4) ;
    printf("%d\n",ret);
    unsigned long r = _lrotr(ret,4);
    printf("%d\n",r);
    return 0 ;
}

运行结果:

640.png

往期精彩

C语言常用的几种排序


C语言、嵌入式中几个非常实用的宏技巧


C语言#和##连接符在项目中的应用(漂亮)


C语言表驱动法编程实践(精华帖,建议收藏并实践)

目录
相关文章
|
Ubuntu 中间件 Linux
linux php添加扩展zip libzip ZipArchive功能
linux php添加扩展zip libzip ZipArchive功能
309 1
超漂亮二次元导航HTML源码
超漂亮网站导航HTML源码,页面中调用了很多外站链接需自行更换 修改方法:使用记事本右键打开修改即可~
345 0
超漂亮二次元导航HTML源码
|
安全 算法 网络安全
IPSec VPN配置实验
IPSec VPN配置实验
749 7
|
算法 安全 Java
深入解析ECC(椭圆曲线密码学)加解密算法
深入解析ECC(椭圆曲线密码学)加解密算法
深入解析ECC(椭圆曲线密码学)加解密算法
|
存储 SQL 关系型数据库
MySQL job 定时任务
MySQL job 定时任务
|
消息中间件 监控 Java
好文!12个策略解决 Kafka 数据丢失问题
以上这些策略对于解决 kafka 数据丢失问题很有帮助,如果你正在使用 kafka,或者正在学习 kafka,V 哥觉得你都应该把这12种策略收藏起来并消化掉,这对你在大型项目应用中非常有用。欢迎关注威哥爱编程,一起向技术大神进发。
564 0
|
安全 NoSQL 关系型数据库
CentOS7下搭建并体验HFish开源蜜罐系统
CentOS7下搭建并体验HFish开源蜜罐系统
1218 0
CentOS7下搭建并体验HFish开源蜜罐系统
|
XML 算法 C语言
【C/C++ 静态代码检查工具 Cppcheck 】Cppcheck 检测器列表和检查规则大全一览
【C/C++ 静态代码检查工具 Cppcheck 】Cppcheck 检测器列表和检查规则大全一览
1661 0
|
Linux
Linux设备驱动之多个同类设备共用一套驱动
Linux设备驱动之多个同类设备共用一套驱动
341 0
「装杯系列」驱动强制结束360核晶主动防御
「装杯系列」驱动强制结束360核晶主动防御