• <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 心羽 閱讀(553) 評論(0)  編輯 收藏 引用 所屬分類: C/C++
            日韩va亚洲va欧美va久久| 色妞色综合久久夜夜| 欧美亚洲另类久久综合婷婷| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 国产成人99久久亚洲综合精品| 国产精品久久久久乳精品爆 | 久久亚洲精品无码aⅴ大香| 欧洲人妻丰满av无码久久不卡| 久久精品www| 思思久久99热免费精品6| 嫩草伊人久久精品少妇AV| 久久国产精品久久久| 亚洲午夜久久久| 久久er国产精品免费观看2| 亚洲国产视频久久| 国产福利电影一区二区三区,免费久久久久久久精 | 久久免费精品视频| 久久久久久精品免费看SSS| 久久精品一区二区| 亚洲精品美女久久777777| 欧美国产精品久久高清| 亚洲国产成人久久综合一| 无码超乳爆乳中文字幕久久| 午夜精品久久久久9999高清| 91精品国产综合久久四虎久久无码一级| 精品无码久久久久国产动漫3d| 久久婷婷五月综合97色直播| 99久久久久| 久久综合九色综合97_久久久 | 久久久精品久久久久特色影视| 国产情侣久久久久aⅴ免费| 久久久久免费精品国产| 合区精品久久久中文字幕一区| 国产精品99久久久久久董美香| …久久精品99久久香蕉国产| 五月丁香综合激情六月久久| 久久久久久久久波多野高潮| 亚洲成av人片不卡无码久久 | 久久精品国产只有精品66 | 国产欧美久久久精品影院| 久久综合亚洲色一区二区三区|