搜索
bottom↓
回复: 19

请教大家一个关于数组位移的思路问题

[复制链接]

出0入0汤圆

发表于 2017-10-15 09:36:54 | 显示全部楼层 |阅读模式
本帖最后由 dexidz 于 2017-10-15 10:27 编辑

如题  我有0-48个数, 算是数组元素里6个元素的每个位,我想了很久,想得到任意两个位中间全变成1的  数组
还是看图吧,能直观点
不知道为啥图传不上来,我发附件吧,附件也传不上来,我看回复能传不




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

 楼主| 发表于 2017-10-15 09:39:44 | 显示全部楼层
传图片显示 Server (IO) Erro  是什么意思

出0入0汤圆

 楼主| 发表于 2017-10-15 10:29:35 | 显示全部楼层
传图片太费劲了,不是大了,就是截图有错误,图片是正的,但传上来又是反的,大家只能勉强看了

出0入4汤圆

发表于 2017-10-15 10:34:02 | 显示全部楼层
循环不行?

出0入0汤圆

发表于 2017-10-15 11:41:54 | 显示全部楼层

循环不行?

出0入8汤圆

发表于 2017-10-15 11:45:09 来自手机 | 显示全部楼层
循环不行?

出0入0汤圆

发表于 2017-10-15 11:53:38 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2017-10-15 11:54:07 来自手机 | 显示全部楼层
定义个48位的二维数组存放48个灯的port和PIN脚,然后用for循环,如果是stm32就更简单了,直接存PIN脚对应的位带地址就行

出0入0汤圆

发表于 2017-10-15 12:01:23 | 显示全部楼层
你是要点亮某一个范围的灯吗?

uint8_t Led[6];
void LedOnRange( uint32_t from, uint32 to)
{
}

void LedOnRange( uint32_t from, uint32 count)
{
}

出0入93汤圆

发表于 2017-10-15 12:13:01 | 显示全部楼层
我假设你用了STM32,反正你发在这个分区了,就姑且这么认为吧,那么48个灯(0~47号)直接一个数字全管了,long long A; 只取低48位。于是,假如我要让a~b (0 <= a < b <= 47) 之间的位全部变成1,其中a号不变,b号变为1。那么
  1. long long Mask = ((1 << b+1) - 1) - ((1 << a+1) - 1) ;
  2. A |= Mask;
复制代码

不过我非常怀疑LZ的表述水平,你平时这么说话对方能准确领略到你的意图吗?你说图是反的然而是横着的,你说0~48个数这不就有49个了吗你6个字节放得下不。

出0入0汤圆

发表于 2017-10-15 13:05:39 | 显示全部楼层
不考虑位带,或其它硬件加速,只依靠纯C

将起始位偏移,转换为字节、字或双字(分别对应8,16,32位,根据你的处理器位宽选择,以下简称字)
计算结束位的字偏移和位偏移

将两个字之间的完整字填0或1,起始字节就把末尾填直,结束字的开始位填值即可

出0入0汤圆

发表于 2017-10-15 13:54:54 | 显示全部楼层
先把数组共用体到u128 让编译器去处理字节问题  假设填充23456一共5位 就是位或1111100  去掉0是11111  2的6次方减1然后左移2位  2的6次方就是1左移5位      

出0入0汤圆

发表于 2017-10-15 14:01:10 | 显示全部楼层
如果上百字节数组 似乎只能都除以8找到所在字节 把中间整字节填充(如果有) 再填充两头了 前后都在同一字节是特例

出0入0汤圆

 楼主| 发表于 2017-10-16 09:38:59 | 显示全部楼层

谢谢帮我把图正过来了,辛苦了

出0入0汤圆

 楼主| 发表于 2017-10-16 09:40:16 | 显示全部楼层
q457344370 发表于 2017-10-15 11:54
定义个48位的二维数组存放48个灯的port和PIN脚,然后用for循环,如果是stm32就更简单了,直接存PIN脚对应的 ...

谢谢给的思路,但二维数组我还是想不通,我在好好想想

出0入0汤圆

 楼主| 发表于 2017-10-16 09:50:53 | 显示全部楼层
takashiki 发表于 2017-10-15 12:13
我假设你用了STM32,反正你发在这个分区了,就姑且这么认为吧,那么48个灯(0~47号)直接一个数字全管了,l ...

哈哈,先感谢您的提示,看的出来你是高手,你的思路我要消化很长时间,看不懂呢
我确实是表达问题没清楚,语言组织能力有问题,哈哈,平时说话我也感觉自己挺笨的,谢谢理解啊
好哥们,很喜欢你
是这样的流程    第一次过来个参数,比如10  那就就是在第10个比特位是开始的位置,当第二个参数过来时比如15,
那么就在第15个比特位结束 10到15之间全变成1,  当第三次过来参数时如果是12,那么15到12比特位在全是1
不知道这样我说清楚了没,因为在上班,所以有空我在好好描述下,

出0入0汤圆

 楼主| 发表于 2017-10-16 09:54:17 | 显示全部楼层
xivisi 发表于 2017-10-15 13:05
不考虑位带,或其它硬件加速,只依靠纯C

将起始位偏移,转换为字节、字或双字(分别对应8,16,32位,根据 ...

谢谢 大侠啊!您说的我不懂,我初学水平。我还在学习的路上,哈哈

出0入0汤圆

 楼主| 发表于 2017-10-16 09:55:27 | 显示全部楼层
huangqi412 发表于 2017-10-15 13:54
先把数组共用体到u128 让编译器去处理字节问题  假设填充23456一共5位 就是位或1111100  去掉0是11111  2的 ...

也谢谢您的回复,您说的这个我不太理解,我好好学一下吧

出0入0汤圆

发表于 2017-10-16 10:07:57 | 显示全部楼层
dexidz 发表于 2017-10-16 09:50
哈哈,先感谢您的提示,看的出来你是高手,你的思路我要消化很长时间,看不懂呢
我确实是表达问题没清楚 ...

。。。这么说都不要或了,每次直接赋值等于。

出0入0汤圆

发表于 2017-10-16 14:06:52 | 显示全部楼层
dexidz 发表于 2017-10-16 09:50
哈哈,先感谢您的提示,看的出来你是高手,你的思路我要消化很长时间,看不懂呢
我确实是表达问题没清楚 ...

就不能每次都传个起始和结束吗?你这样抽象都不知道怎么写
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 23:03

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表