如何将最高有效位(第23位)填充或扩展到第24到31位

时间:2015-04-30 15:06:32

标签: c

我想知道,我怎样才能将最重要的位(第23位)扩展到24到31位?我怎么能用C代码呢?我正在使用C代码编写Nios II。

我正在考虑使用位移操作但不知道如何通过使用位移操作来实现上述功能,非常感谢任何链接或资源。

提前谢谢。

3 个答案:

答案 0 :(得分:4)

正如卡尔所说,如果实施得到定义,那就转右了。您可以使用其他始终有效的二元运算符:

if (0 != (0x00800000 & x))   //test if bit 23 is set
{
    x |= 0xFF000000;   //set bits 24-31
}
else
{
    x &= 0x00FFFFFF;  //clear bits 24-31
}

答案 1 :(得分:2)

C右移运算符在右移时具有实现定义的行为。自Nios II has an arithmetic right-shift instruction以来,你可以简单地做到:

x = (x << 8) >> 8;

仔细检查输出程序集,确保它使用sra系列中的指令。

答案 2 :(得分:1)

@IronMensan的变体,它依赖于被修改的整数是32位的合理假设。

以下仅影响位24-31,即使整数更宽。

#define Mask2431 (0xFF000000)
#define Bit23    (0x800000)

some_int |= Mask2431; 
if (!(some_int & Bit23)) 
  some_int ^= Mask2431; 

以下会影响第24位,即使使用宽于32位的整数,也会更高:

#define Mask24 (0xFFFFFF)
#define Bit23    (0x800000)

some_int &= Mask24;
if (some_int & Bit23) 
  some_int = ~some_int ^ Mask24;