新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 计算机科学论坛计算机技术与应用『 C/C++编程思想 』 → 一些有关C++语言中的bit操作[转帖] 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 4800 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 一些有关C++语言中的bit操作[转帖] 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     enorm 帅哥哟,离线,有人找我吗?
      
      
      威望:4
      头衔:头衔
      等级:大三暑假(参加全国数模竞赛拿了一等奖)(版主)
      文章:144
      积分:854
      门派:Lilybbs.net
      注册:2005/12/1

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给enorm发送一个短消息 把enorm加入好友 查看enorm的个人资料 搜索enorm在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看enorm的博客楼主
    发贴心情 一些有关C++语言中的bit操作[转帖]

    Author:Jeff    2005-11-30

    关键字:C/C++  bit  位操作

    以下大多从网上和书中来,有些则加入了个人的见解~~

    1)  函数实现交换两个int型变量的值,要求不定义任何中间变量。

    C / C++ 版:

    void Swap(int *a, int *b)

    {

    *a^=*b;

       *b^=*a;

       *a^=*b;

    }

    C++ 版:

    void Swap(int &a, int &b)

    {

    a^=b;

       b^=a;

       a^=b;

    }

    分析一下:

    (a ^ b = s)       (b ^ s = a)

    0 ^ 1 = 1        1 ^ 1 = 0

    1 ^ 0 = 1        0 ^ 1 = 1

    1 ^ 1 = 0        1 ^ 0 = 1

    0 ^ 0 = 0        0 ^ 0 = 0

    归结一下:1. 两个数相异或,相同的位清0,不同的位置1。 (所以才有了 XOR eax, eax ;eax清零)

              2. s = (a ^ b); (b ^ s) == a ? Yes. 异或加密解密的基础.

    2) 摘自《高效程序的奥秘》一书。英文书名<Hacker’s Delight>,译为《黑客的窃喜》

       获得后缀0bit的个数。(从低位开始的连续的0bit,间接地求最低位的1bit的位置)

    int ntz(unsigned x)  {         // Number of trailing zeros.

        int n;

    if (x == 0) return(32);

    n = 1;

    if ((x & 0x0000FFFF) == 0) {n = n +16; x = x >>16;}

    if ((x & 0x000000FF) == 0) {n = n + 8; x = x >> 8;}

            if ((x & 0x0000000F) == 0) {n = n + 4; x = x >> 4;}

            if ((x & 0x00000003) == 0) {n = n + 2; x = x >> 2;}

            return n - (x & 1);

    }

    3) 除了最低位的bit1,其余位全清0. <Hacker’s Delight>一书。

       n = n & (-n)   < - - - - > n = n & (~n + 1)

    分析一下:

    假设n(2) = X…X10…0。其中每个X代表bit值并不都是相同,0的个数≥0,¯X表示该位取反。

    X & ¯X = 0, 1 & 0 = 0

        则~n(2) = ¯X…¯X01…1。

          ~n + 1 = ¯X…¯X10…0。

             n & (~n + 1) = 0…010…0

    4) 清最低位的bit1,其他不变。

       n = n & (n – 1);

       则 n – 1 = X…X01…1

          n & (n - 1) = X…X00…0

    5) 获得bit1的个数。(统计)

       我们常用的方法:

    int Get1BitCount(unsigned int x)

    {

       int n = 0;

    while (x > 0) {

        if (x & 0x1) n++;

        x >>= 1;

    }

    return n;

    }

    另一种更好的办法:

    int Get1BitCount(unsigned int x)

    {

        int  n = 0;

        while (x > 0) {

    n++;

    x = x & (x - 1);

         }

         return n;

    }

    6) 求unsigned int型数一共有多少bit?(网上看到有人问)

    int  nCount = Get1BitCount((unsigned int)~0);

    求别的数据类型的位数,要重载Get1BitCount(或者直接用temlate来实现)。

    不过觉得像上面这样求法,太浪费了,不是吗?

    int GetTotalBit(void)

    {

        unsigned int x = ~0;

        int  n = 0;

        while (x > 0) {

    n += 8;

    x >>= 8;

         }

         return n;

    }

    7)  清除低位到高位的n个bit1。

        while (--n > 0) {

            x = x & (x - 1);

    }

    8)  (以后有再慢慢更新)


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    天亮了

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/12/21 13:51:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/26 7:20:22

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    62.500ms