gpt4 book ai didi

c++ - 位窗口操作

转载 作者:行者123 更新时间:2023-11-28 05:57:28 24 4
gpt4 key购买 nike

假设我有 2 个 64 位无符号整数。我有一个大小为 k 的窗口,有一次它从第一个整数的末尾开始,到第二个整数的开始结束。 (当然,我知道从哪里开始)

比如第一个是...0110011,第二个是110...... 并且窗口从第一个开始>0,窗口大小为10。输出应为 0110011 110

我的问题是,如何写出这样一个像样的程序来解决这个问题?我尝试使用掩码,然后意识到我得到了 2 个 block 位整数(0110011 和 110......),但我不知道如何将它们连接在一起。

最佳答案

试试这个:

#include <stdio.h>
int main() {
unsigned long long i1 = 0x0123456789ABCDEFULL;
unsigned long long i2 = 0x11223344AABBCCDDULL;

// window start 7, size 12 bits
// so it should include bits 7..0 from i1 and 63..60 from i2
int windowStart = 7; // bit 7 of i1
int windowSize = 12;

// Number of most significant bits needed from i2
int numBitsFromSecondNum = windowSize - windowStart - 1;
// AND mask of i1 to obtain the least significant bits from it
unsigned long long chunk1 = i1 & ((1 << (windowStart+1)) - 1);
// Right shift i2 to obtain the most significant bits from it
unsigned long long chunk2 = i2 >> (64 - numBitsFromSecondNum);

// Concatenation of the 2 chunks
unsigned long long result = (chunk1 << numBitsFromSecondNum) | chunk2;

printf("%llX\n", chunk1); // prints: EF
printf("%llX\n", chunk2); // prints: 1
printf("%llX\n", result); // prints: EF1

return 0;
}

窗口开始和大小与您的问题不同,但我选择它们对齐到 4 位,以便轻松查看以十六进制打印的输出。

在上面的代码中,我假设 unsigned long long(与 unsigned long long int 相同)大小为 64 位。 C 标准保证它至少是 64 位,这意味着它可以更大(例如 128 位)。最好换成(8*sizeof(unsigned long long))

关于c++ - 位窗口操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33859013/

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