- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
问题是:给定一个整数 val1
找到最高位集(最高有效位)的位置,然后给定第二个整数 val2
找到从第一个整数产生的位置左侧的未设置位的连续区域。 width
指定必须在连续性中找到的未设置位的最小数量(即 width
中没有 1 的零)。
这是我的解决方案的 C 代码:
#include <limits.h> /* for CHAR_BIT - number of bits in a char */
typedef unsigned int t;
unsigned const t_bits = sizeof(t) * CHAR_BIT;
_Bool test_fit_within_left_of_msb( unsigned width,
t val1, /* integer to find MSB of */
t val2, /* integer to find width zero bits in */
unsigned* offset_result)
{
unsigned offbit = 0; /* 0 starts at high bit */
unsigned msb = 0;
t mask;
t b;
while(val1 >>= 1) /* find MSB! */
++msb;
while(offbit + width < t_bits - msb)
{
/* mask width bits starting at offbit */
mask = (((t)1 << width) - 1) << (t_bits - width - offbit);
b = val2 & mask;
if (!b) /* result! no bits set, we can use this */
{
*offset_result = offbit;
return true;
}
if (offbit++) /* this conditional bothers me! */
b <<= offbit - 1;
while(b <<= 1)
offbit++; /* increment offbit past all bits set */
}
return false; /* no region of width zero bits found, bummer. */
}
除了找到第一个整数的 MSB 的更快方法之外,零 offbit
的注释测试似乎有点无关紧要,但如果设置了 t
类型的最高位,则有必要跳过它。无条件地将 b
左移 offbit - 1
位将导致无限循环,并且掩码永远不会超过 val2 的高位中的 1(否则,如果高位为零则没有问题)。
我也实现了类似的算法,但在第一个数字的 MSB 右侧工作,因此它们不需要这个看似额外的条件。
我怎样才能摆脱这个额外的条件,甚至是否有更好的解决方案?
编辑:一些背景不是严格要求的。偏移结果是从高位开始的位数,而不是预期的从低位开始的位数。这将是更广泛的算法的一部分,该算法扫描二维数组以查找零位的二维区域。在这里,为了测试,算法已被简化。 val1
表示在二维数组的一行中没有设置所有位的第一个整数。由此,二维版本将扫描下来,这就是 val2
所代表的。
这是一些显示成功和失败的输出:
t_bits:32
t_high: 10000000000000000000000000000000 ( 2147483648 )
---------
-----------------------------------
*** fit within left of msb test ***
-----------------------------------
val1: 00000000000000000000000010000000 ( 128 )
val2: 01000001000100000000100100001001 ( 1091569929 )
msb: 7
offbit:0 + width: 8 = 8
mask: 11111111000000000000000000000000 ( 4278190080 )
b: 01000001000000000000000000000000 ( 1090519040 )
offbit:8 + width: 8 = 16
mask: 00000000111111110000000000000000 ( 16711680 )
b: 00000000000100000000000000000000 ( 1048576 )
offbit:12 + width: 8 = 20
mask: 00000000000011111111000000000000 ( 1044480 )
b: 00000000000000000000000000000000 ( 0 )
offbit:12
iters:10
***** found room for width:8 at offset: 12 *****
-----------------------------------
*** fit within left of msb test ***
-----------------------------------
val1: 00000000000000000000000001000000 ( 64 )
val2: 00010000000000001000010001000001 ( 268469313 )
msb: 6
offbit:0 + width: 13 = 13
mask: 11111111111110000000000000000000 ( 4294443008 )
b: 00010000000000000000000000000000 ( 268435456 )
offbit:4 + width: 13 = 17
mask: 00001111111111111000000000000000 ( 268402688 )
b: 00000000000000001000000000000000 ( 32768 )
***** mask: 00001111111111111000000000000000 ( 268402688 )
offbit:17
iters:15
***** no room found for width:13 *****
(iters 是内部 while 循环的迭代次数,b 是结果 val2 & mask
)
最佳答案
这http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious有几种方法可以计算无符号整数的无符号整数以2为底(也是最高位集合的位置)。
我认为这是您想要的一部分。我怀疑,如果我真的知道你想要什么,我可以建议一种更好的计算方法或可以达到相同目的的方法。
关于c - 在另一个整数的 MSB 位置左侧的整数中查找 N 个连续的零位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2791878/
我希望将 LSB、MSB 的字节数组转换为 int 的数组 目前,我正在使用 for 循环并单独转换每组值, void ConvertToInt(int OutArray[], byte InArra
我想分配一个 std_logic_vector 而不给出界限。像这样: constant xy: std_logic_vector := "100111"; 当我想访问单个位时: xy(0), xy(
我检查了用于反转位顺序的 SWAR 算法(SIMD W在 A Rregister 中) unsigned int 的。 signed int 有类似的东西吗? 最佳答案 该算法仅适用于无符号整数,因为
当我使用下面的代码更改 32 位时,或者当 bitc 等于 31 时,它给出 -2147483643。 它似乎将所有 0 更改为 1,而不是仅将最后一个 0 更改。我怎样才能在代码中解决这个问题?预先
对于给定的数字 unsigned int a = 1203; 仅对上述示例增加最重要的小数位 a = 2203; 如何实现? 我是这样开始的 for (n=a; n; n/=10){ b = n%10
以unsigned char为例。 它的范围是0 到 255。 如果我尝试在其中存储 256,将发生以下情况:- 256 的二进制文件 100000000 由于它由9位组成,因此MSB 1将被丢弃,它
我正在通过将位打包到一个 uint 数组中来实现一个位向量。 getBit(index)函数执行 (array[cell] & (1 > bit获取是否已设置位。这适用于除 MSB 之外的所有位。它不
我想知道一个字节的第一位是什么值。 例如: 我有 byte m = (byte) 0x8C; 我怎么知道第一位是 1 还是 0? 谁能帮帮我? 最佳答案 这取决于你所说的“第一位”是什么意思。如果您的
我需要将十六进制字符串中的 MSB 和其余位分开。例如:我有一个十六进制字符串 a2,相当于 1010 0010。我想分离出 MSB(在本例中为 1),其余数字转换为十进制。我想我可以做这样的事情:
我有一个 20 个字/字节的数组,存储一个 160 位数。如何找到从 msb 开始的第一个非零位。我需要找到位的位置,然后相应地从第一个'1'位置开始我需要做一些操作。 最佳答案 如果您使用的是 gc
我有一个函数返回 1 Byte uint8_t fun(); 该函数应该运行 9 次,所以我得到 9 字节 我想将最后一个 8 作为 4 short values 这里我所做的,但是我'我不确定我得到
我正在努力转换在特定微 Controller 上运行的程序,并使其适应在树莓派上运行。我已经成功地从我一直在使用的传感器中提取值,但现在我遇到了一个问题,我认为这是由我无法理解的几行代码引起的。我已经
所以我想切换我数字的最高有效位。这是一个例子: x = 100101 then answer should be 00101 我有一台 64 位机器,因此我不希望答案是 100000....10010
给定一个 len 类型的 signed short 元素数组,它是在数组中的最大绝对值元素中找到设置的最高有效位的位置。例如,如果数组 L 包含 {-134, 123, 0, -890} 那么 f(L
在中断子程序(每 5 µs 调用一次)中,我需要检查一个字节的 MSB 并将其复制到该字节的其余部分。 我需要做类似的事情: if(MSB == 1){byte = 0b11111111} else{
我正在交叉编译 MIPS 处理器(little-endian arch)的开源库 oRTP。我的开发系统是i386 linux。我将配置脚本运行为 ./configure --host=mips-li
在两个有符号整数的二进制加法中,如果进出 MSB 列的进位不匹配,则会出现有符号溢出。 这条规则背后的逻辑是什么?为什么进位和执行应该匹配才能得到正确的结果。请解释一下。 最佳答案 显然有两种不匹配的
我有一个二进制协议(protocol),它将每个有效负载字节的 MSB 提取到 MSB 集合字节(七进制)中进行传输,并在接收器端重新注入(inject) MSB。有效负载由 n 个四字节帧组成,具体
我有以下代码用于从非负整数获取 MSB(最高有效位),更具体地说是 Int32: private static readonly int[] powersOf2 = new int[]
我以 2 字节短值的十六进制值形式获取数据,但交换值后丢失了。 signed short value = 0x0040; value = (value*0.5) - 40; convertMSB
我是一名优秀的程序员,十分优秀!