gpt4 book ai didi

c++ - 手动更改 unsigned int 中的一组字节

转载 作者:太空宇宙 更新时间:2023-11-04 01:20:00 25 4
gpt4 key购买 nike

我正在使用 C 语言,我正在尝试弄清楚如何更改 32 位无符号整数中的一组位。

例如,如果我有

int a = 17212403u;

在二进制中,它变为 1000001101010001111110011。现在,假设我标记了这些位,它们以小端格式排列,最右边的位代表一个,右边第二个代表两个,依此类推,我如何手动更改一组位?

例如,假设我想更改位,使第 11 位到第 15 位的十进制值为 17。这怎么可能?

我正在考虑通过这样做来获得该范围:

unsigned int range = (a << (sizeof(a) * 8) - 14) >> (28)

但我不确定从现在开始该往哪里走。

最佳答案

您将 (1) 首先必须清除位 11..15,然后 (2) 然后根据您要设置的值设置这些位。要实现 (1),请创建一个将所有位设置为 1 的“掩码”除了你想清除的那些;然后使用 a & bitMask将位设置为 0 .然后,使用 | myValue将位设置为所需的值。使用位移运算符 <<将掩码和值放在正确的位置:

int main(int argc, char** argv) {

// Let's assume a range of 5 bits
unsigned int bitRange = 0x1Fu; // is ...00000000011111

// Let's assume to position the range from bit 11 onwards (i.e. move 10 left):
bitRange = bitRange << 10; // something like 000000111110000000000
unsigned int bitMask = ~bitRange; // something like 111111000001111111111
unsigned int valueToSet = (17u << 10); // corresponds to 000000101110000000000

unsigned int a = (17212403u & bitMask) | valueToSet;

return 0;
}

这是解释发生了什么的长版本。简而言之,您还可以这样写:

unsigned int a = (17212403u & ~(0x1Fu << 10)) | (17u << 10)

关于c++ - 手动更改 unsigned int 中的一组字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46533652/

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