[問題] bit位移請教

看板C_and_CPP (C/C++)作者 (iop14759)時間2年前 (2021/04/28 16:04), 2年前編輯推噓7(706)
留言13則, 10人參與, 2年前最新討論串1/1
我想請問一下,位移是把最高(低)位元移除,最低(高)位元補0 假設有一個變數X=0xA5,我想要只取被移除的值 讓結果得到Y[8]={1,0,1,0,0,1,0,1},我該怎麼寫? 我現在的方式是 Y[0]=X&0x80; Y[0]=Y[0]>>7; Y[1]=X&0x40; Y[1]=Y[1]>>6; Y[2]=X&0x20; Y[2]=Y[2]>>5;...總共重覆8次 有辦法直接把X的最高位元移位到其他變數嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.248.158.217 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1619597091.A.A13.html

04/28 16:14, 2年前 , 1F
C++ 用 std::bitset?
04/28 16:14, 1F
我是PIC用microchip的MPLAB,好像沒法include

04/28 16:30, 2年前 , 2F
八次可以寫成一個for loop阿
04/28 16:30, 2F
我現在是一個for loop,0x80,0x40和>>7,>>6都是用變數 但只是想問看看有沒有比現在這方法更快的 ※ 編輯: IOP14759 (60.248.158.217 臺灣), 04/28/2021 16:34:52

04/28 17:49, 2年前 , 3F
迴圈搭配bitset 就做到了..
04/28 17:49, 3F

04/28 18:17, 2年前 , 4F
你的快是指要少打幾個程式碼還是執行時間快?
04/28 18:17, 4F

04/28 20:17, 2年前 , 5F
建個表直接查?
04/28 20:17, 5F

04/28 20:52, 2年前 , 6F
組語的RLCF或RRCF 把最旁邊的bit移到carry flag
04/28 20:52, 6F

04/28 20:52, 2年前 , 7F
直接看carry flag來決定你的變數要填1還是0
04/28 20:52, 7F

04/28 21:00, 2年前 , 8F
我是覺得Y[i] = (X&(1<<i)) ? 1:0; 就夠簡單易懂了
04/28 21:00, 8F

04/28 21:06, 2年前 , 9F
阿 修正 不用再看carry flag 一律RLCF到空的暫存就是了
04/28 21:06, 9F

04/28 23:33, 2年前 , 10F
PIC? 純bitwise何不用他的 ASM
04/28 23:33, 10F

04/29 00:02, 2年前 , 11F
for(i=0;i<8;i++) Y[i] = (X&(1<<i))>>i;
04/29 00:02, 11F

04/29 02:26, 2年前 , 12F
for(i=0, m=1;i<8;i++, m<<=1) Y[i] = ((X&m)!=0);
04/29 02:26, 12F
暫時夠用了,感謝大家 ※ 編輯: IOP14759 (60.248.158.217 臺灣), 04/29/2021 09:13:14

04/30 15:43, 2年前 , 13F
看看用bitfield有沒有符合你的要求吧
04/30 15:43, 13F
文章代碼(AID): #1WYHSZeJ (C_and_CPP)
文章代碼(AID): #1WYHSZeJ (C_and_CPP)