Re: [心得] Bitwise parallel

看板C_and_CPP作者 (蝙輻超人)時間14年前 (2010/03/27 11:17), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/3 (看更多)
原文恕刪~ 這份筆記寫得很好~本來要問的都有了~但....才疏學淺,看不懂 小弟也許觀念錯很大~請大家不吝指教~~ : 假設給定一個32bit無號整數,如果以byte為單位切成四份,求這四份的數字總合。 : 範例 0x09ABCDEF -> 0x09 + 0xAB + 0xCD + 0xEF : 直覺的方法就是 : x & 0xFF + (x&0xFF00 >> 8) + (x&0xFF0000 >> 16) + (x&0xFF000000 >> 24) x& 0xFF 假設 x 01010101 ----------------32bits & 11111111 000000000000000032bits ---------------------------------------這樣可以取到前8bits沒錯 x&0xFF00 >> 8 x 01010101 10101010 --------------- & 11111111 00000000 --------------- ------------------------------------------------ 01010101 00000000 >> 00000000 01010101 這樣不也是只取到前8bits,沒記錯的話「&」和「>>」不是優先順序一樣, 所以會由左而右計算,但如果改成 x & (0xFF00 >> 8)是不是比較正確 0xFF00 11111111 00000000 >> 00000000 11111111 x 01010101 10101010 ------------------------------------------ 00000000 10101010 取到第9~16位元 : 同樣的技巧,也可以用來做把整數中的bit反轉的動作 : (簡單的實作需要16次的交換) : x = ((x >> 1) & 0x55555555) | ((x & 0x55555555) << 1); : x = ((x >> 2) & 0x33333333) | ((x & 0x33333333) << 2); : x = ((x >> 4) & 0x0F0F0F0F) | ((x & 0x0F0F0F0F) << 4); : x = ((x >> 8) & 0x00FF00FF) | ((x & 0x00FF00FF) << 8); : x = ( x >> 16 ) | ( x << 16); 哇~~這完全看不懂~還畫了32bits跟著照做~結果算到腦袋發空~ 可否麻煩好心人士解釋一下原理~萬分感謝~ -- 阿嬤說:「人生不是得到,就是學到。」 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.187.52.246
文章代碼(AID): #1BhNZF-5 (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文
完整討論串 (本文為第 2 之 3 篇):
文章代碼(AID): #1BhNZF-5 (C_and_CPP)