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)
最有可能的问题是:
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>能够使用它们.
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |