所以,我需要在C中编写二进制文字。我的编译器不理解二进制文字。我知道“0b”有一个gcc扩展名,但这不是一个选项。在你说之前,“为什么你需要那个?? Hex是出于某种原因而发明的,noob”,听我说...
这是为了掩码目的。我正在将Sega Genesis / Megadrive的游戏移植到Sega Saturn。所述游戏中的碰撞使用16x16瓦片。每个16x16磁贴具有两字节值,格式为SSTT YXII IIII IIII。 SS是交替碰撞层中瓦片的坚固性,TT是普通碰撞层中瓦片的坚固性。 00表示不是固体,01表示顶部固体,10表示左/右/底部固体,11表示全部固体。 Y是Y-flip标志,X是X-flip标志,II IIII IIII是16x16 tile的索引。
你可以(希望)看到为什么我想用二进制表示这些。我将编写其中的100个,并且更容易想到位的可靠性,而不是十六进制。看看0b0110要容易得多,“好吧,替代碰撞瓦片是顶部固体,而正常的是底部固体”,而不是看看0x6并做同样的事情。如果我想将第二个图块更改为顶部实体,我宁愿将0110更改为0101,而不是弄清楚我需要将6更改为5.希望您理解为什么我希望它以二进制编写。这是一次更容易。
无论如何,我正在研究世嘉土星。这意味着我坚持使用任何C编译器(我实际上甚至不确定它是哪个编译器,或者那个版本的C),所以我不能使用stdio.h,math.h或者任何东西。地狱,我不得不为模数写一个宏。
我已经看到了一些古怪(但可行)的解决方案,但它们似乎都需要stdio ...我更喜欢它是一个宏,或者编译器足够智能省略的东西。当你使用16兆比特的ram时,每个周期和一点ram计数,但我很多而不是写531 0011 1111而不是53f。二进制文件有一个非常容易理解的格式,我想以这种方式编写它。
提前致谢!
答案 0 :(得分:1)
对于你想要的,我会写一个宏:
#define TILE_VALUE(S, T, Y, X, I) (((S) << 14) | ((T) << 12) | ((Y) << 11) | ((X) << 10) | (I))
然后使用此宏
定义表初始值设定项答案 1 :(得分:0)
你可以使用这样的宏:
#define BIN2(dig1, dig2) (dig1 << 1 | dig2)
#define BIN3(dig1, dig2, dig3) (dig1 << 2 | dig2 << 1 || dig3)
等等,需要实现多少位。然后,0b110
的等效值为BIN3(1, 1, 0)
。
答案 2 :(得分:0)
使用预处理器宏来定义碰撞字。例如,
#define BIT_PAIR_00 0
#define BIT_PAIR_01 1
#define BIT_PAIR_10 2
#define BIT_PAIR_11 3
#define BINARY2(nn) (BIT_PAIR_ ## nn)
#define COLLISION_PACK(ss, tt, yx, index) ((index & 0x3FF) | (BINARY2(ss) << 14) | (BINARY2(tt) << 12) | (BINARY2(yx) << 10) )
允许你使用例如。
COLLISION_PACK(01, 00, 11, 142) == 0x4c8e == 0b0100110010001110
COLLISION_PACK(00, 10, 00, 200) == 0x20c8 == 0b0010000011001000
COLLISION_PACK(10, 01, 00, 0x1fe) == 0x91fe == 0b1001000111111110
或者,也可以使用宏作为参数:
#define NONE 0u
#define TOP 1u
#define NOT_TOP 2u
#define ALL 3u
#define NO_FLIP 0u
#define FLIP_X 1u
#define FLIP_Y 2u
#define FLIP_XY 3u
#define COLLISION_PACK(ss, tt, flip, index) \
( ((index) & 0x3FFu) | \
(((flip) & 3u) << 10) | \
(((tt) & 3u) << 12) | \
(((ss) & 3u) << 14) )
允许你使用例如。
COLLISION_PACK(SOLID_NONE, SOLID_NONE, FLIP_NONE, 1)
== 0x0001 == 0b0000000000000001 == 00 00 00 0000000001
COLLISION_PACK(SOLID_NOTTOP, SOLID_TOP, FLIP_X, 2)
== 0x9402 == 0b1001010000000010 == 10 01 01 0000000010
COLLISION_PACK(SOLID_ALL, SOLID_NOTTOP, FLIP_XY, 0x1fe)
== 0xedfe == 0b1110110111111110 == 11 10 11 0111111110