gpt4 book ai didi

c++ - 移位和创建掩码

转载 作者:行者123 更新时间:2023-11-28 04:20:27 25 4
gpt4 key购买 nike

我正在创建一个采用 3 个整数(开始、结束、z)的方法,结果应该是 1 或 0 的掩码,具体取决于从开始到结束的 z。

例如,如果调用 getMask(2,6,1),结果是:00000000000000000000000001111100

出于某种原因,当我调用 getMask(0,31,1) 时,我得到:00000000000000000000000000000000代替11111111111111111111111111111111

我的方法代码是:

if (z == 1)
{
return ~(~0 << (end - start + 1)) << (start);
}
else if (z == 0)
{
return ~(~(~0 << (end - start + 1)) << (start));
}

我想知道为什么我会得到那个结果而不是预期的结果。

编辑:所以我明白为什么会这样,但我该如何解决?

最佳答案

这是它的一个工作版本:

#include "limits.h"
#include <stdio.h>

unsigned int get_mask(int start, int end, int z);
void p(unsigned int n);
int main() {
p(get_mask(2, 6, 1));
p(get_mask(0, 31, 1));
p(get_mask(0, 31, 0));
p(get_mask(1, 31, 1));
p(get_mask(1, 31, 0));
p(get_mask(6, 34, 1));
}

unsigned int get_mask(int start, int end, int z) {
int rightMostBit = end - start + 1;
unsigned int res = ~0;
if (rightMostBit < sizeof(int) * CHAR_BIT) {
res = ~(res << rightMostBit);
}
res = res << start;
if (z == 0) {
res = ~res;
}
return res;
}

void p(unsigned int n) {
for (int i = 31; i >= 0; --i) {
if (n & (1 << i)) {
printf("1");
}
else {
printf("0");
}
}
printf("\n");
}

我基本上是做第一类和~只有在不溢出的情况下。如果是,则初始 ~0 已经准备好移动 start 位。

关于c++ - 移位和创建掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55563103/

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