如何使用unsigned int进行算术右移?

问题描述 投票:0回答:3

这是一个家庭作业问题。

我需要将无符号8位数转换为32位有符号数。

例如,我有这个无符号的8位数:1111 1010

所以在32位签名时应该是1111 1111 1111 1111 1111 1111 1111 1010

我怎样才能做到这一点?我知道>>只有一个带有1的填充,当它是一个有符号的int时所以我可以在向右移位之前将其转换为有符号的int。

唯一的问题是我对我的问题有限制,这说明我需要创建一个“只使用左右移位和一个减法”的函数。

c bit-manipulation
3个回答
2
投票
unsigned givenByte = 0xFA;              /*This can be any given byte that we want to pad.*/
unsigned foo = (givenByte >> 7) << 8;   /*This leaves us with only the most significant bit of the original byte shifted left by one place.*/
unsigned result = givenByte - foo;

这应返回类似于带符号算术移位的结果,除非这些操作是在无符号整数上执行的,并且仅使用移位和一次减法。

givenByte = 1111 1010
foo       = 0000 0000 0000 0000 0000 0001 0000 0000
result    = 1111 1111 1111 1111 1111 1111 1111 1010

这个问题偶尔出现在CMU教科书和其他采用类似风格的课程中,这就是我遇到这个问题的方式。花了一些时间,但这种方法很整洁,并且可以应用于我们需要算术右移但没有显式转换的其他情况(这就是我认为这个问题的框架)。


0
投票

通过签名的8位进行转换应该可以解决问题吗?

uint8_t start = 0xFF;
int32_t end = (int8_t)start;

或者你不允许在你的家庭作业中这样做吗?

在这种情况下,由于右移进行符号扩展,向上然后向下移动将起作用。

uint8_t start = 0xFF;
int32_t end = (start << 24) >> 24;

-2
投票

你需要一个适当的32位掩码。并将掩码的最右边8位设置为8位无符号整数。这会给你结果。

首先,你应该自己尝试一些代码,然后尝试寻求帮助。

© www.soinside.com 2019 - 2024. All rights reserved.