作者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/cn.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