• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            唐吉訶德

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              5 Posts :: 75 Stories :: 3 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(2)

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            最近筆者一直在做JPEG的解碼工作,發現用完全使用哈夫曼樹進行解碼比較費時,而使用表結構存儲編碼和值的對應關系比較快捷,但是也存在比較難處理的地方,比如解碼工作通常是以位為單位的操作,這里必然會涉及到移位操作,而筆者之前對位的操作很少,經驗很欠缺,經過這次歷練終于發現了一個自己曾經忽視的東西,那就是C/C++中的移位操作容易出錯的情況。

            1、什么樣的數據類型可以直接移位

            char、short、int、long、unsigned char、unsigned short、unsigned int、unsigned long都可以進行移位操作,而double、float、bool、long double則不可以進行移位操作。

            2、有符號數據類型的移位操作

            對于char、short、int、long這些有符號的數據類型:

            • 對負數進行左移:符號位始終為1,其他位左移
            • 對正數進行左移:所有位左移,即 <<,可能會變成負數
            • 對負數進行右移:取絕對值,然后右移,再取相反數
            • 對正數進行右移:所有位右移,即 >>

            3、無符號數據類型的移位操作

            對于unsigned char、unsigned short、unsigned int、unsigned long這些無符號數據類型:

            沒有特殊要說明的,使用<< 和 >> 操作符就OK了

            結束語

            8086 中存在邏輯移位、算術移位,而C\C++中的移位似乎既不是邏輯移位,也不是算術移位。

            比如-1,我們若對它右移1位,C的結果仍舊是-1,事實上無論右移多少位始終是-1,邏輯移位得到的結果(8位表示)應該是-128,所以這點要注意

            例子:
            1.將 13800138000  轉為  91 68 31 08 10 83 00 F0  //91為+ 68國家號 不夠位長以F補

            unsigned char *tt = new unsigned char[12];
                    strcpy((char*)tt,"13800138000");
                    tt[11] = 0xFF;
                    unsigned char *ss = new unsigned char[6];
                    cout << (tt[11]<<4) << endl;
                    memset(ss,0xFF,6);
                    int k=0;
                    for(int i=0; i<12; i=i+2)
                    {
                            ss[k++] = (tt[i+1]<<4)+(tt[i]&0x0F);
                    }
            2. 將 整形 轉為 3位字節型16進制,如將 整型 888 轉為 16進制  00 03 78(Debug下有效,Release下無效)
               char param[4] = {0};
                int iParamLen = 888;
                param[0] = iParamLen >> 16;
                param[1] = ((iParamLen >> 8) << 32) >> 32;
                param[2] = (iParamLen << 32) >> 32;

            反之

                char param[4] = {0x00,0x03,0x78};
                int ii1 = 0;
                ii1 = param[0];
                ii1 =ii1 << 8;
                ii1 = ii1 | param[1];
                ii1 =ii1 << 8;
                ii1 = ii1 | param[2];
            posted on 2011-01-23 14:53 心羽 閱讀(567) 評論(0)  編輯 收藏 引用 所屬分類: C/C++
            久久国产成人午夜AV影院| 精品人妻久久久久久888| 精品久久久久久久中文字幕| 亚洲国产精品久久久久久| 久久婷婷色综合一区二区| 亚洲国产精品久久久久久| 一本色道久久综合| 亚洲国产精品无码成人片久久| 久久精品无码午夜福利理论片| 久久精品国产免费一区| 日韩欧美亚洲综合久久| 久久综合丁香激情久久| 久久99久国产麻精品66| 国产精品久久久久久久久久免费| 97香蕉久久夜色精品国产| 久久久精品午夜免费不卡| 久久精品无码一区二区WWW| 久久综合欧美成人| 天堂久久天堂AV色综合| 久久er国产精品免费观看8| 久久精品黄AA片一区二区三区| 无码任你躁久久久久久老妇| 久久不射电影网| 久久久久99精品成人片直播| 中文字幕无码久久人妻| 99久久精品无码一区二区毛片 | 亚洲精品乱码久久久久久蜜桃图片| 国产麻豆精品久久一二三| 久久人人爽人人爽人人片AV东京热| 青青热久久综合网伊人| 狠狠色婷婷久久一区二区三区| 囯产精品久久久久久久久蜜桃 | 久久人人爽人人爽人人片AV东京热| 久久久久久国产精品免费无码 | 久久久久亚洲av成人无码电影| 久久精品视频网| 午夜不卡888久久| 天天综合久久久网| 精品久久人人妻人人做精品| 99久久国产综合精品网成人影院 | 久久久WWW免费人成精品|