提取和修改位
从压缩的final_value中的某个位置选取n个位,并写入任意位置,而不修改uint16_t test_bit=0x3048的原始内容。预期输出=0x5048
例如:从final_val选取010(位置17的3位),然后写入任意位置(位置11)
0x3048=0111 0000 0100 1000
0x5048=0101 0000 0100 1000
示例
A:
粗体是提取的,我们从Val_1中提取位 0 到 7,并仅替换Val_2中的位 0 到 7,使位 8 到 15 保持不变。
Val_1 0x1b7 0000 0001 1011 0111
Val_2 0x27b7 0010 0111 1011 0111
示例B:
从Val1中提取3位[从位8到10],并替换Val_2中的位[从11到13]
Val_1 0x129 0000 0001 0010 1001
Val_2 0x4C48 0100 1100 0100 1000
目前已尝试:
#include <stdio.h>
#include <stdint.h>
void read_and_write(uint32_t* final_val, uint16_t* write_val, uint8_t start_pos, uint8_t end_pos)
{
uint32_t temp = *final_val;
*write_val = (uint16_t) ((temp >> start_pos) & ((1 << end_pos) - 1)); // store the desired number of bits in write_val
*final_val = (temp >> end_pos); //shift final_val by end_pos since those bits are already written
printf("\n temp %x, write_val %x, final_val %x ", temp, *write_val, *final_val);
}
void main()
{
uint32_t final_val = 0x0; //Stores 20 extracted bits from val1, val2 and val3 into final_val (LSB to MSB in order)
uint16_t ext_val1 = 0x80;
uint8_t ext_val2 = 0x0;
uint8_t ext_val3 = 0x2;
final_val = (ext_val1 | (ext_val2 << 9) | (ext_val3 << 17));
printf ("\n final_val %x", final_val);
uint16_t data_1, data_2, data_3, write_val1, write_val2, write_val3;
// Read first 9 bits of final_val and write only into [0:9] position of existing data_1
uint8_t start_pos = 0;
uint8_t end_pos = 9;
data_1 = 0x80;
read_and_write(&final_val, &write_val1, start_pos, end_pos);
write_val1 = write_val1 | data_1;
// Read next 8 bits of final_val and write only into [0:8] position of existing data_2
start_pos = 0;
end_pos = 8;
data_2 = 0x27b7;
read_and_write(&final_val, &write_val2, start_pos, end_pos);
write_val2 = write_val2 | data_2;
//Read next 3 bits of final_val and write only into[13:11] position of existing data_3
start_pos = 11;
end_pos = 13;
data_3 = 0x3048;
read_and_write(&final_val, &write_val3, start_pos, end_pos);
write_val3 = write_val3 | data_3;
printf ("\n val1 0x%x val2 0x%x val3 0x%x final_val 0x%x", write_val1, write_val2, ext_val3, final_val);
}
有人能帮一下吗?用旧方法忽略陈旧的代码。
在这里,您可以使用提取特定位的值并将其替换为从另一个值中提取的值的函数。
uint32_t extract(uint32_t read_data, int n_bits, int pos)
{
uint32_t mask = (n_bits < (CHAR_BIT * sizeof(mask) - 1)) ? ((1LU << n_bits) - 1) << pos : -1;
return (mask & read_data) >> pos;
}
uint32_t replace(uint32_t read_val, uint32_t write_val, int read_pos, int write_pos, int n_bits)
{
uint32_t extracted = extract(read_val, n_bits, read_pos);
uint32_t mask = (n_bits < (CHAR_BIT * sizeof(mask) - 1)) ? ((1LU << n_bits) - 1) << write_pos : -1;
write_val &= ~mask;
write_val |= extracted << write_pos;
return write_val;
}
int main (void)
{
uint32_t val = 0x1234;
uint32_t val2 = 0xabcd;
printf("%x\n", extract(val, 4, 8));
printf("%x\n", replace(val, val2, 4, 8, 4));
}
下面是一个带有助手函数和测试框架的简单实现:
代码如下:
#include <stdio.h>
#include <stdint.h>
uint32_t extract(uint32_t data, int pos, int n) {
return (data >> pos) & (((uint32_t)1 << n) - 1);
}
uint32_t replace(uint32_t val1, uint32_t val2, int pos1, int n, int pos2) {
uint32_t mask = (((uint32_t)1 << n) - 1) << pos2;
return (val2 & ~mask) | (extract(val1, pos1, n) << pos2);
}
void test(uint32_t val1, uint32_t val2, int pos1, int n, int pos2) {
uint32_t res = replace(val1, val2, pos1, n, pos2);
printf("extracting bits [%d-%d] from 0x%04X to bits [%d-%d] in 0x%04X -> 0x%04X\n",
pos1, pos1 + n - 1, val1, pos2, pos2 + n - 1, val2, res);
}
int main() {
test(0x1234, 0x7048, 1, 3, 11);
test(0x01b7, 0x2743, 0, 8, 0);
test(0x0129, 0x7448, 8, 3, 11);
return 0;
}
输出:
extracting bits [1-3] from 0x1234 to bits [11-13] in 0x7048 -> 0x5048
extracting bits [0-7] from 0x01B7 to bits [0-7] in 0x2743 -> 0x27B7
extracting bits [8-10] from 0x0129 to bits [11-13] in 0x7448 -> 0x4C48
我有一个xml,我想提取其中的一部分。但我无法得到它。如果我使用变量并将每个键放入变量中,我可以得到那个部分,但这是一个非常漫长的过程。那幺,是否有任何简短的流程? 下面是 XML : 我想要< code>network link集合中的xml。
问题内容: 如果我有一个字节,该方法将如何在某个位置取回一个位? 这是我所知道的,我认为它不起作用。 我要从中检索信息的字节的名称在哪里。 问题答案: 按位置向右移动ID将使#position位在数字中最靠右的位置。将其与按位与1结合将告诉您是否设置了该位。
问题内容: 我有一个像这样的numpy数组: 如何一步一步获取特定索引位置的值?例如: 结果应为: 问题答案: 只是索引使用你
我是c语言的新手。我只有一些基本的知识,比如复制和粘贴。这意味着我的c语言不好。对不起我的英语。现在是我的问题。我有一个记事本。txt文件。它包含一些参数和我从其他程序获得的值。 对此的描述。txt文件:[单位可选]name\u of\u参数=值 便条簿。txt文件: 没有机会获得此输出的其他样式(.txt文件)。 除此之外,我还有一个带有随机行和列的excel工作表。第一行是\u参数的名称,如-
我们在JFrog艺术工厂中设置了虚拟和远程存储库。最近,我们在从中央提取包时看到了问题。例如,艺术工厂的最新版本是2.3.1:https://xxx.xxx.xx/artifactory/mvn_central/de/codecentric/spring-boot-admin-starter-server/最新版本是2.4.1:https://mvnrepository.com/artifact/
问题内容: 如果我有一些代码,例如 并且输入文件包含成对的行,我该如何做,以便仅导入每行的第一行?因此,换句话说,每条奇数行都只有?谢谢 问题答案: 您可能想考虑使用来简化奇数行()的过滤。或者在另一种方法中,如果您使用的是JDK7,则可以使用该方法,并在迭代时再次过滤奇数。