作者IOP14759 (iop14759)
看板C_and_CPP
標題[問題] bit位移請教
時間Wed Apr 28 16:04:46 2021
我想請問一下,位移是把最高(低)位元移除,最低(高)位元補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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1619597091.A.A13.html
1F:→ nh60211as: C++ 用 std::bitset? 04/28 16:14
我是PIC用microchip的MPLAB,好像沒法include
2F:→ MOONRAKER: 八次可以寫成一個for loop阿 04/28 16:30
我現在是一個for loop,0x80,0x40和>>7,>>6都是用變數
但只是想問看看有沒有比現在這方法更快的
※ 編輯: IOP14759 (60.248.158.217 臺灣), 04/28/2021 16:34:52
3F:→ FinanceBrain: 迴圈搭配bitset 就做到了.. 04/28 17:49
4F:→ kobe8112: 你的快是指要少打幾個程式碼還是執行時間快? 04/28 18:17
5F:推 oToToT: 建個表直接查? 04/28 20:17
6F:推 chuegou: 組語的RLCF或RRCF 把最旁邊的bit移到carry flag 04/28 20:52
7F:→ chuegou: 直接看carry flag來決定你的變數要填1還是0 04/28 20:52
8F:推 chuegou: 我是覺得Y[i] = (X&(1<<i)) ? 1:0; 就夠簡單易懂了 04/28 21:00
9F:推 chuegou: 阿 修正 不用再看carry flag 一律RLCF到空的暫存就是了 04/28 21:06
10F:→ yoche2000: PIC? 純bitwise何不用他的 ASM 04/28 23:33
11F:推 yuichanprpr: for(i=0;i<8;i++) Y[i] = (X&(1<<i))>>i; 04/29 00:02
12F:推 EdisonX: for(i=0, m=1;i<8;i++, m<<=1) Y[i] = ((X&m)!=0); 04/29 02:26
暫時夠用了,感謝大家
※ 編輯: IOP14759 (60.248.158.217 臺灣), 04/29/2021 09:13:14
13F:推 joefaq: 看看用bitfield有沒有符合你的要求吧 04/30 15:43