将按位操作从C#移植到C

Eri*_*ric 3 c c# bit-manipulation bit-shift bitwise-operators

我需要一些帮助将这个C#代码移植到C.我已经在C#中工作了很好但是我在C中得到了错误的返回.我应该将这个位分解成单独的行吗?我以为我的数据类型有问题,但我认为我有正确的数据类型.这是返回0x03046ABE的工作代码

  UInt32 goHigh(UInt32 x) { return (UInt32)(x & 0xFFFF0000); }          
  UInt32 goLow(UInt32 x) { return (UInt32)(x & 0xFFFF); } 

  UInt32 magic(UInt32 pass){
      UInt32 key = pass;
      UInt16 num = 0x0563;
      key = (goLow(key) << 16) | (UInt16)(((num >> 3) | (num << 13)) ^ (goHigh(key) >> 16));
      return key; //returns 0x03046ABE

   }

  magic(0x01020304);
Run Code Online (Sandbox Code Playgroud)

这是我正在努力工作的错误C代码

  unsigned long  goHigh(unsigned long  x) { 
         return (unsigned long )(x & 0xFFFF0000); }          
  unsigned long  goLow(unsigned long  x) { 
         return (unsigned long )(x & 0xFFFF); } 

  unsigned long  magic(unsigned long  pass){
      unsigned long key = pass;
      unsigned int num = 0x0563;
      key = (goLow(key) << 16) | (unsigned int)(((num >> 3) | (num << 13)) ^ (goHigh(key) >> 16));
      return key;
  }

  magic(0x01020304); //returns 0xb8c6a8e
Run Code Online (Sandbox Code Playgroud)

koc*_*ica 5

最有可能的问题是:

key = (goLow(key) << 16) | (unsigned int)(((num >> 3) | (num << 13)) ^ (goHigh(key) >> 16));
                            ^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

你期望的是16位.它可能在不同的机器上更大.与无符号长整数相同,可能是64位而不是32,正如您所期望的那样.

确定,使用uint32_t&uint16_t.你必须#include <stdint.h>能够使用它们.