Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2621200
  • 博文数量: 315
  • 博客积分: 3901
  • 博客等级: 少校
  • 技术积分: 3640
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-08 15:32
个人简介

知乎:https://www.zhihu.com/people/monkey.d.luffy Android高级开发交流群2: 752871516

文章分类

全部博文(315)

文章存档

2019年(2)

2018年(1)

2016年(7)

2015年(32)

2014年(39)

2013年(109)

2012年(81)

2011年(44)

分类: C/C++

2012-07-20 12:41:02

  为了理解下位(Bit)的操作,我对之前笔试遇到的位的逆序进行一个学习和总结,现在理解起来好多了,看来很多东西是不练不行,得经常练习才是王道,起码对我这个记性不好的人来说是这样的,只有真正的跟程序跑跑,然后多练习,渐渐的才可以理解和记忆。

点击(此处)折叠或打开

  1. /*
  2.  ============================================================================
  3.  Name : bit_operate.c
  4.  Author : hl
  5.  Version :
  6.  Copyright : Your copyright notice
  7.  Description : bit_operate in C, Ansi-style
  8.  ============================================================================
  9.  */

  10. #include <stdio.h>
  11. #include <stdlib.h>

  12. /*位逆序操作---to unsigned char (不太高效的算法,不过比较容易理解)
  13.  * 原理:原数 依次向右移动,取出每一位;
  14.  * 新数 不断与原数相或,依次左移,推入每一位;
  15.  * 分析:类似出栈,入栈的操作。
  16.  */
  17. unsigned char reverse_bit (unsigned char a)
  18. {
  19.     int n = 7;
  20.     unsigned char newc = 0x00;

  21.     int i = 0;
  22.     for (i = 0; i < n; i++)
  23.     {
  24.         newc |= (a & 1);
  25.         newc <<= 1;
  26.         a >>= 1;
  27.     }
  28.     return newc;
  29. }

  30. /*理解不了...经过了网友的解析和自己用笔写了写,算是明白了...
  31.  * 分析:(其最终的原理就是 : 首先是2位2位为一组,交换前一半和后一半。再4位4位为一组,交换前一半和后一半。再8位为一组,交换前一半和后一半);
  32.  * 举例:假设unsigned char c = abcdefgh (8位)
  33.  * 1> 0xaa 0x55
  34.  * 1010 1010 0101 0101
  35.  * (c & 0xaa) => (a0c0e0g0 >> 1) => 0a0c0e0g
  36.  * (c & 0x55) => (0b0d0f0h << 1) => b0d0f0h0
  37.  * 0a0c0e0g | b0d0f0h0 => badcfehg ;完成第一次交换
  38.  * 分析:其实就像作者描述的——看作是纸条,上面画了很多单元格:
  39.  * a)以第1个格子为起点,每隔一个挖空一个格子,然后整体移动一格,不为空的格子填上了空格子;
  40.  * b)接着在一个新的纸条上挖格子,但是和第一次不同,以第0个格子为起点,每隔一个挖空一个格子,然后左移,不为空的格子填上了空格子;
  41.  * c)最后两个新改造的纸条重合,完成第一轮交换;
  42.  * 2> 0xcc 0x33
  43.  * 1100 1100 0011 0011
  44.  * 分析:做法和第一次类似,不过是以四个为一组,左(右)移动变两个?这点是为了实现两个为一个整体进行交换;
  45.  * 3> 0xf0 0x0f
  46.  * 1111 0000 0000 1111
  47.  * 分析:最后以四个为一组交换,完成整个位的逆序过程;
  48.  */
  49. unsigned char reverse_bit_efficient (unsigned char c)
  50. {
  51.         c = (c & 0xaa) >> 1 | (c & 0x55) << 1;
  52.         c = (c & 0xcc) >> 2 | (c & 0x33) << 2;
  53.         c = (c & 0xf0) >> 4 | (c & 0x0f) << 4;

  54.         return c;
  55. }
  56. /*
  57.  * 改为宏定义
  58.  */
  59. #define REVERSE_BIT(ch) do{ \
  60.         ch = (ch & 0xaa) >> 1 | (ch & 0x55) << 1; \
  61.         ch = (ch & 0xcc) >> 2 | (ch & 0x33) << 2; \
  62.         ch = (ch & 0xf0) >> 4 | (ch & 0x0f) << 4;         \
  63. }while(0);

  64. int main(void) {
  65.     unsigned char ch0 = 0x08;
  66.     printf("before reverse, ch0 is %d\n", ch0);
  67.     puts("after reverse....");
  68.     ch0 = reverse_bit_efficient(ch0);
  69.     printf("ch0 is %d\n", ch0);
  70.     REVERSE_BIT(ch0);
  71.     printf("ch0 is %d\n", ch0);

  72.     return EXIT_SUCCESS;
  73. }
阅读(1266) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~