• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > 数据压缩位操作中的一个函数bit_rot_left"位向左轮转"看不懂,望指点

数据压缩位操作中的一个函数bit_rot_left"位向左轮转"看不懂,望指点

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了数据压缩位操作中的一个函数bit_rot_left"位向左轮转"看不懂,望指点等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:数据压缩位操作中的一个函数bit_rot_left "位向左轮转"看不懂,望指点

解决方案1:

嗯 你那个程序有错。。。我没有去调试它,不过我写了一个好用的:

#include <stdio.h>

int gcd(int a, int b)
{   
    return b == 0 ? a : gcd(b, a % b); 
}   

void swap(unsigned char *a, unsigned char *b) 
{   
    unsigned char tmp = *a; 
    *a = *b; 
    *b = tmp;
}   

void rot1(unsigned char *bits, int size, int count)
{   
    int m = gcd(size, count), i, j;
    unsigned char tmp;
    count %= size;
    count = size - count;
    for (i = 0; i < m; i++)
    {   
        tmp = bits[i];
        for (j = i + count; j != i; j += count) 
        {
            if (j > size)
                j -= size;
            swap(&tmp, bits + j);
        }
        bits[i] = tmp;
    }   
}   

void rot2(unsigned char *bits, int size, int count)
{   
    int i;
    unsigned char mask = ~0 << (8 - count), tmp1 = 0, tmp2;
    for (i = size - 1; i >= 0; i--)
    {   
        tmp2 = (mask & bits[i]) >> (8 - count);
        bits[i] <<= count;
        bits[i] |= tmp1;
        tmp1 = tmp2;
    }   
    bits[size - 1] |= tmp1;
}   

void bit_rot_left(unsigned char *bits, int size, int count)
{
    rot1(bits, size, count / 8);
    rot2(bits, size, count % 8);
}

void print_bits(unsigned char *bits, int size)
{
    int i, j;
    for (i = 0; i < size; i++)
        for (j = 0x80; j; j >>= 1)
            printf("%d", !!(j & bits[i]));
    printf("\n");
}

int main()
{
    unsigned char bits[]="10010101";
    print_bits(bits, 8);
    bit_rot_left(bits,8,2);
    printf("%s\n",bits);
    print_bits(bits, 8);

    return 0;
}

输出如下

0011000100110000001100000011000100110000001100010011000000110001
????????
1100010011000000110000001100010011000000110001001100000011000100

解决方案2:

测试程序应该这样写才对:

int main()
{
    unsigned char bits[3]={0x4b,0xdb,0};
    bit_rot_left(bits,16,2);
    printf("%#x,%#X,%#x",bits[0],bits[1],bits[2]);
}

输出是
0x2f,0x6D,0


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 数据压缩位操作中的一个函数bit_rot_left"位向左轮转"看不懂,望指点

相关文章

  • 2017-06-07 (golang)能否为go的基本类型如int实现某个接口?
  • 2017-06-07 用zendstudio+xdebug单步调试php
  • 2017-06-07 pdf插入图片如何实现?
  • 2017-06-07 (laravel)homestead安裝後,訪問頁面出錯
  • 2017-06-07 我想模拟itunes登录,第一步验证怎么过
  • 2017-06-07 python调用selenium打开chrome浏览器失败
  • 2017-06-07 谁知道怎么写服务器端的程序来实现二级联动
  • 2017-06-07 图片本地硬盘备份
  • 2017-06-07 微信不实名不能发红包微信发红包提示‘签名错误’
  • 2017-06-07 python菜鸟问一个print的问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • uploadify上传图片到七牛multipart/form-data如何设置
    • 为什么对map对象进行列表解析会返回空列表
    • DZX32的话怎么用七牛
    • LinuxShell变量替换操作
    • 上传不了比较大的图片
    • vim中查找替换的正则表达式与js等编程语言中的有哪些区别?
    • PYTHONfor循环给二维数组赋值
    • Laravel用ajax提交这个表单,控制器code应该怎么写?
    • 请教一个问题,原来ERP系统是使用是latin1_General_BIN进行存储数据,现在中文数据库中提取是乱码,希望用PYTHON或者PHP的方式进行转码
    • VC是否能获取java程序界面数据

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有