c - 如何对无符号整型使用算术右移?

标签 c bit-manipulation

这是一个家庭作业问题。

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

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

因此,在 32 位签名中,它应该是 1111 1111 1111 1111 1111 1111 1111 1010

我该怎么做?我知道 >> 当它是有符号整型时仅用 1 填充,因此我可以在向右移位之前将其转换为有符号整型。

唯一的问题是我对我的问题有限制,即我需要创建一个“仅使用左移和右移以及一次减法”的函数。

最佳答案

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 教科书和其他采用类似风格的类(class)中偶尔会出现,这就是我遇到这个问题的方式。花了一些时间,但这个方法很简洁,可以应用于我们需要算术右移而无需显式转换的其他情况(我认为问题是这样构建的)。

关于c - 如何对无符号整型使用算术右移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14721275/

相关文章:

c - C结构中成员的地址

c - 如果 x*x 可以容纳 32 位整数,如何返回 1,否则返回 0?

python - 为什么按位运算没有提前终止?

比较C中不同格式的两个日期

c - 无法理解如何处理 C 字符串

algorithm - 对于给定的两个整数 A 和 B,找到一对数字 X 和 Y,使得 A = X*Y 且 B = X xor Y

algorithm - 计算在任何位偏移处包含 4 位值的字节的最快方法?

javascript - javascript中>>>按位移位运算符的用途是什么?

c - 如何在循环内获取字符而不在循环中停止?

c - 带有循环的 Swift 3.1 模式