【求助】计算字节中1的个数
ARM 中, 我记得有条指令,可以直接求出字节中1的个数,不必一位一位查。还有第1次出现的1出现在第几位。 你可能记错了?x86有popcnt,bitscanforward/bitscanreverse。 只有字节的话,用查表(size=256)岂不更快 两位大神,真有的,我忘记了,因为不怎么用 ARM-M3内核没有求出1的个数的指令,有计算前导0的数目指令 SCREA 发表于 2022-11-3 21:00两位大神,真有的,我忘记了,因为不怎么用
(引用自4楼)
查了下 M3 内核的指令表(thumb),只有一个 CLZ 指令满足类似的要求,计算前导0个数。
高级的 ARM 应该会有更具体的计数指令,不过没玩过也没具体手册...
软件实现的话,可以看看《高效算法的奥秘》中的第5章 谢谢楼上各位老师,哪天我想起来补上。 之前在IAR中找见的,也可能是IAR自带的库。 SCREA 发表于 2022-11-3 21:22
谢谢楼上各位老师,哪天我想起来补上。 之前在IAR中找见的,也可能是IAR自带的库。 ...
(引用自8楼)
CLZ 指令倒是见过,其他的就没见过了,
先占个位置听课。 本帖最后由 iamseer 于 2022-11-4 10:00 编辑
https://developer.arm.com/documentation/ddi0406/c/Application-Level-Architecture/Instruction-Details/Alphabetical-list-of-instructions/VCNT
需要支持neon才行,一般A系列的ARM上有,cortex-M没有。 不是有个帖子专门讨论过这个吗?就是弄个一个简单的算法,可以只需要几步就得到结果,比通用的轮询和查表都快一些, printf("%u\n", a ^ (a - 1)); sbusr 发表于 2022-11-4 17:07
printf("%u\n", a ^ (a - 1));
(引用自12楼)
别欺负我没学过C语言,我可也是自学了if else 的:)
a=2时结果是多少?难道 =3吗?等于255时结果是多少?难道等于1吗? 本帖最后由 sbusr 于 2022-11-5 12:45 编辑
1a2b3c 发表于 2022-11-4 22:51
别欺负我没学过C语言,我可也是自学了if else 的:)
a=2时结果是多少?难道 =3吗?等于255时结果是多少 ...
(引用自13楼)
我记错了,是有个什么类似的算法的……
补充:
https://blog.csdn.net/weixin_67711401/article/details/123339380
下面这个应该是相对快的算法
int NumberOf1(int n)
{
int count = 0;
while (n)
{
n = n & (n - 1);
count++;
}
return count;
} sbusr 发表于 2022-11-5 12:05
我记错了,是有个什么类似的算法的……
补充:
(引用自14楼)
你这个验证没有计算FF最快几个循环?我是看不懂,就是和8个循环相比
之前有个帖子,专门讨论这个,印象中好像是说最多只要4个循环,所以当时觉得是最优的, 之前讨论的帖子:https://www.amobbs.com/thread-5769455-1-1.html /*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
* CORE FUNCTIONS
*
* (c) Copyright 1992-2012, Micrium, Weston, FL
* All Rights Reserved
*
* File : OS_CORE.C
* By : Jean J. Labrosse
* Version : V2.92.07
*
* LICENSING TERMS:
* ---------------
* uC/OS-II is provided in source form for FREE evaluation, for educational use or for peaceful research.
* If you plan on usinguC/OS-IIin a commercial product you need to contact Micrium to properly license
* its use in your product. We provide ALL the source code for your convenience and to help you experience
* uC/OS-II. The fact that thesource is provided doesNOTmean that you can use it withoutpaying a
* licensing fee.
*********************************************************************************************************
*/
#defineMICRIUM_SOURCE
#ifndefOS_MASTER_FILE
#defineOS_GLOBALS
#include <ucos_ii.h>
#endif
/*
*********************************************************************************************************
* PRIORITY RESOLUTION TABLE
*
* Note: Index into table is bit pattern to resolve highest priority
* Indexed value corresponds to highest priority bit position (i.e. 0..7)
*********************************************************************************************************
*/
INT8UconstOSUnMapTbl = {
0u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x00 to 0x0F */
4u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x10 to 0x1F */
5u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x20 to 0x2F */
4u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x30 to 0x3F */
6u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x40 to 0x4F */
4u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x50 to 0x5F */
5u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x60 to 0x6F */
4u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x70 to 0x7F */
7u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x80 to 0x8F */
4u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x90 to 0x9F */
5u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0xA0 to 0xAF */
4u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0xB0 to 0xBF */
6u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0xC0 to 0xCF */
4u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0xD0 to 0xDF */
5u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0xE0 to 0xEF */
4u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u/* 0xF0 to 0xFF */
};
第二个问题:UCOS-II中是查表 稍微相关的有:
CLZ: Count Leading Zeroes. 这位同学准备在程序中准备祭出汇编了么?如果被BOSS逼这么厉害,换个高速单片机用C语言查表可以吧
页:
[1]