gpt4 book ai didi

c++ - 如何从左到右计算一个字节中顺序设置位的数量,直到第一个 0?

转载 作者:搜寻专家 更新时间:2023-10-31 01:19:42 25 4
gpt4 key购买 nike

我的英语不好,我不能问得更好,但请在下面:

如果二进制字节为 1 0 0 0 0 0 0 0 则结果为 1
如果二进制字节是 1 1 0 0 0 0 0 0 那么结果是 2
如果二进制字节是 1 1 1 0 0 0 0 0 那么结果是 3
如果二进制字节是 1 1 1 1 0 0 0 0 那么结果是 4
如果二进制字节是 1 1 1 1 1 0 0 0 那么结果是 5
如果二进制字节是 1 1 1 1 1 1 0 0 那么结果是 6
如果二进制字节是 1 1 1 1 1 1 1 0 那么结果是 7
如果二进制字节是 1 1 1 1 1 1 1 1 那么结果是 8

但是如果例如二进制字节是 1 1 1 0 * * * * 那么结果是 3。

我将通过一次操作确定从左到右连续设置了多少位。

结果不是必须的1-8的数字,只是为了区分。我认为在一两次操作中是可能的,但我不知道如何。

如果您不知道短至 2 个操作的解决方案,请也写下,我不会再尝试了。

最佳答案

我能想到的最简单的非分支解决方案:

y=~x
y|=y>>4
y|=y>>2
y|=y>>1

反转x,并将最左边的1位(对应非反转值中最左边的0位)向右扩展。将给出不同的值(虽然不是 1-8,但进行映射非常容易)。

110* ****

变成

001* ****
001* **1*
001* 1*1*
0011 1111

编辑:

正如另一个答案中所指出的,使用预先计算的查找表可能是最快的。仅给定 8 位,就内存消耗而言,它甚至可能是可行的。

编辑:

嘿,哎呀,我的错..你可以跳过反转,而是做 ands。

x&=x>>4
x&=x>>2
x&=x>>1

这里

110* ****

给予

110* **0*
110* 0*0*
1100 0000

如您所见,所有以 110 开头的值都将产生相同的输出 (1100 0000)。

编辑:

实际上,“and”版本基于未定义的行为(移动负数),如果使用带符号的 8 位(即 char,而不是 C 中的 unsigned char),通常会做正确的事情,但正如我所说行为未定义,可能并不总是有效。

关于c++ - 如何从左到右计算一个字节中顺序设置位的数量,直到第一个 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5771022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com