SCREA 发表于 2022-11-3 20:44:07

【求助】计算字节中1的个数

ARM 中, 我记得有条指令,可以直接求出字节中1的个数,不必一位一位查。还有第1次出现的1出现在第几位。

wye11083 发表于 2022-11-3 20:53:53

你可能记错了?x86有popcnt,bitscanforward/bitscanreverse。

t3486784401 发表于 2022-11-3 20:57:44

只有字节的话,用查表(size=256)岂不更快

SCREA 发表于 2022-11-3 21:00:48

两位大神,真有的,我忘记了,因为不怎么用

modbus 发表于 2022-11-3 21:10:29

ARM-M3内核没有求出1的个数的指令,有计算前导0的数目指令

t3486784401 发表于 2022-11-3 21:11:39

SCREA 发表于 2022-11-3 21:00
两位大神,真有的,我忘记了,因为不怎么用
(引用自4楼)

查了下 M3 内核的指令表(thumb),只有一个 CLZ 指令满足类似的要求,计算前导0个数。
高级的 ARM 应该会有更具体的计数指令,不过没玩过也没具体手册...



Huaan 发表于 2022-11-3 21:13:28

软件实现的话,可以看看《高效算法的奥秘》中的第5章

SCREA 发表于 2022-11-3 21:22:04

谢谢楼上各位老师,哪天我想起来补上。 之前在IAR中找见的,也可能是IAR自带的库。

security 发表于 2022-11-4 09:19:13

SCREA 发表于 2022-11-3 21:22
谢谢楼上各位老师,哪天我想起来补上。 之前在IAR中找见的,也可能是IAR自带的库。 ...
(引用自8楼)

CLZ 指令倒是见过,其他的就没见过了,
先占个位置听课。

iamseer 发表于 2022-11-4 09:58:43

本帖最后由 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没有。

1a2b3c 发表于 2022-11-4 16:51:40

不是有个帖子专门讨论过这个吗?就是弄个一个简单的算法,可以只需要几步就得到结果,比通用的轮询和查表都快一些,

sbusr 发表于 2022-11-4 17:07:18

printf("%u\n", a ^ (a - 1));

1a2b3c 发表于 2022-11-4 22:51:14

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:05:48

本帖最后由 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;
}

1a2b3c 发表于 2022-11-5 13:03:11

sbusr 发表于 2022-11-5 12:05
我记错了,是有个什么类似的算法的……

补充:

(引用自14楼)

你这个验证没有计算FF最快几个循环?我是看不懂,就是和8个循环相比
之前有个帖子,专门讨论这个,印象中好像是说最多只要4个循环,所以当时觉得是最优的,

TINXPST 发表于 2022-11-5 16:04:15

之前讨论的帖子:https://www.amobbs.com/thread-5769455-1-1.html

鲜衣怒马 发表于 2022-11-5 16:11:35

/*
*********************************************************************************************************
*                                                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中是查表

2nd 发表于 2022-11-5 16:58:40

稍微相关的有:
CLZ: Count Leading Zeroes.

dellric 发表于 2022-11-6 10:51:32

这位同学准备在程序中准备祭出汇编了么?如果被BOSS逼这么厉害,换个高速单片机用C语言查表可以吧
页: [1]
查看完整版本: 【求助】计算字节中1的个数