<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 53, 文章 - 0, 評論 - 3, 引用 - 0
    數據加載中……

    A piece of beautiful and trick bitwise operation code.

    A detailed reading process of a piece of beautiful and trick bitwise operation code.
     
    The following code is from MMIXWare, it is used to implement the Wyde difference between two octabyte.
     
         in file: "mmix-arith.w"
         423 tetra wyde_diff(y,z)
         424   tetra y,z;
         425 {
         426   register tetra a=((y>>16)-(z>>16))&0x10000;
         427   register tetra b=((y&0xffff)-(z&0xffff))&0x10000;
         428   return y-(z^((y^z)&(b-a-(b>>16))));
         429 }
     
    It is hard to understand it without any thinking or verification, here is the process I used
    to check the correctness of this algorithm.

    let y = 0xuuuuvvvv;
         z = 0xccccdddd; (please note the [c]s may be different hex number.)
        
    then y>>16 = 0x0000uuuu;
         z>>16 = 0x0000cccc;
         
    then ((y>>16)-(z>>16)) = 0x1111gggg if #uuuu < #cccc or
         ((y>>16)-(z>>16)) = 0x0000gggg if #uuuu >= #cccc   

    so variable a = 0x00010000 if #uuuu < #cccc or
       variable a = 0x00000000 if #uuuu >= #cccc
      
    similarly, we can get
       variable b = 0x00010000 if #vvvv < #dddd or
       variable b = 0x00000000 if #vvvv >= #dddd

    for (b-a-(b>>16)))), there are four different result depending on the relation between a and b.
    when #uuuu >= #cccc and #vvvv >= #dddd, (b-a-(b>>16)))) = 0x00000000;
    when #uuuu >= #cccc and #vvvv < #dddd, (b-a-(b>>16)))) = 0x00001111;
    when #uuuu < #cccc and #vvvv >= #dddd, (b-a-(b>>16)))) = 0x11110000;
    when #uuuu < #cccc and #vvvv < #dddd, (b-a-(b>>16)))) = 0x11111111;
    You can see that >= map to #0000 and < map to #1111

    for y-(z^((y^z)&(b-a-(b>>16)))), when (b-a-(b>>16)))) is 0x00000000, z^((y^z)&(b-a-(b>>16))) is
    z^((y^z)& 0) = z^0=z, so y-(z^((y^z)&(b-a-(b>>16))))=y-z.
    similarily, when (b-a-(b>>16)))) is 0x11111111, z^((y^z)&(b-a-(b>>16))) is
    z^((y^z)& 1) = z^(y^z)=y, so y-(z^((y^z)&(b-a-(b>>16))))=0.

    when (b-a-(b>>16)))) is 0x11110000 or 0x11110000, we can treat the y and z as two separate wydes.
    each wyde in the result is correct.

    You may think it is a little stupid to verify such kind of details. but for my point of view,
    without such detailed analysis, I can not understand the algorithm in the code. with the hard
    work like this, I successfully understand it. The pleasure deserve the effort.
     
    I am wondering how can the author discover such a genius algorithm.


    posted on 2009-01-06 16:04 InPractice 閱讀(213) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 三级黄色免费观看| 亚洲裸男gv网站| 亚洲人成网站在线观看播放动漫 | 九九热久久免费视频| 亚洲精品日韩中文字幕久久久| 无码国产精品一区二区免费| 成人性生交大片免费看中文| 亚洲av无码成人精品区| 蜜桃成人无码区免费视频网站 | 亚洲va在线va天堂va手机| 久久久久久a亚洲欧洲aⅴ| 尤物永久免费AV无码网站| 免费人成视频在线观看网站| 亚洲免费视频一区二区三区| 一本色道久久88—综合亚洲精品| 777亚洲精品乱码久久久久久| 久久久久亚洲?V成人无码| 四虎亚洲国产成人久久精品| 国产成人 亚洲欧洲| 亚洲一区中文字幕| 亚洲六月丁香六月婷婷蜜芽| 久久精品国产亚洲精品2020| 久久久久亚洲av无码专区蜜芽| 久久精品国产亚洲精品| 久久亚洲中文字幕精品一区四 | 亚洲人成综合网站7777香蕉| 亚洲国产情侣一区二区三区| 亚洲天天做日日做天天欢毛片| 无码乱人伦一区二区亚洲| 亚洲精品免费在线| 亚洲高清一区二区三区| 免费人妻精品一区二区三区| 久久免费香蕉视频| 巨波霸乳在线永久免费视频 | 亚洲一卡2卡3卡4卡国产网站| 在线精品亚洲一区二区| 国产精品无码永久免费888| 午夜免费福利视频| 日韩精品视频免费在线观看| 亚洲精品无码高潮喷水在线| 亚洲Av无码一区二区二三区|