右移二进制补码数就像一个unsigned int

时间:2011-08-29 17:52:00

标签: c bit-manipulation

这可能吗?我有一个签名的int,需要将它移动到4个位置。我无法将int转换为unsigned int,shift然后转换回来。我需要在之后处理它。

所以,如果我有一个像以下那样的序列:

x = 1001

需要将它改为2个点:

x = x >> 2;

我得到了1110;

我想得到0010.我想不出一种方法可以使用and和'或'来做到这一点。有什么想法吗?

具体来说,这就是我需要的。

0x12345678用0xab替换56并以此结束:0x1234ab78

我的方法是获得56的权利,

int right = Ox12345

得到56的左边

int left = Ox 78

得到56

int replace = 56

返回权利|离开|取代

并返回

Ox1234ab78

如果替换品左侧的数字为1,则会遇到问题。因为我将整个事物向左移动然后向右移动,它将1一直转移。

2 个答案:

答案 0 :(得分:1)

你可以做x = (x >> 2) & 0x3FFFFFFF(假设你在谈论32位整数)。这会将2个最高位的位设置为0。

编辑:

看到问题的变化,而不是你的方法,你可以这样做:

int result;
int start = 0x12345678, replace = 0xab;
result = (start & ~0xFF00) | (replace << 8);

答案 1 :(得分:1)

另一个解决方案,因为我记得在高中做类似的任务我们不允许使用大的十六进制数字如下:

x = (x >> 2) & ~((1 << 31) >> 1)。这给出了与我的其他答案相同的答案,但不需要大的十六进制数。