• <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++
            亚洲国产成人精品无码久久久久久综合| 7国产欧美日韩综合天堂中文久久久久 | 国产精品久久久久无码av| 久久久无码精品亚洲日韩蜜臀浪潮| 91久久婷婷国产综合精品青草| 亚洲国产成人久久精品动漫| 亚洲性久久久影院| 久久AV高清无码| 亚洲精品NV久久久久久久久久| 国内精品久久久久影院一蜜桃| 久久久久国产亚洲AV麻豆| 综合网日日天干夜夜久久| 亚洲一本综合久久| 伊人久久综合精品无码AV专区| 九九久久精品无码专区| 99国产欧美久久久精品蜜芽| 欧美伊人久久大香线蕉综合69| 久久久久国产精品| 欧美喷潮久久久XXXXx| 中文字幕无码久久久| 一本伊大人香蕉久久网手机| 精品蜜臀久久久久99网站| 香蕉久久av一区二区三区| 国产成人精品白浆久久69| 老司机午夜网站国内精品久久久久久久久 | 色综合久久久久综合99| 69SEX久久精品国产麻豆| 人妻无码中文久久久久专区| 欧美午夜精品久久久久久浪潮| 狠狠狠色丁香婷婷综合久久五月 | 精品久久久久久久久久久久久久久 | 五月丁香综合激情六月久久| 久久人人爽人人爽AV片| 久久国产精品免费一区二区三区| 久久精品国产亚洲AV大全| 久久久一本精品99久久精品66 | 91精品国产综合久久婷婷| 久久精品无码午夜福利理论片| 亚洲精品乱码久久久久久| 国产成人精品综合久久久久| 亚洲国产精品久久久天堂 |