我一直在尝试这样做一整天,但没有任何运气。
快速解释:我有一个游戏系统,我们通过搜索他的能力字段来匹配某人是否能够进行攻击。
To be able to use the "flame" skill you need to "know" how to do it, it requires the 7th and the 1st bit ON (10 bits): 0000000101
And this would be a player "knowledge" field where we put 1s if they did some work before (10 bits where 1st bit is fire, second bit is ice, third bit is sorcery and so on): 0010110101
当我尝试比较玩家是否"知道"该技能时,我的问题就开始了,因为我无法比较第 1 位或第 3 位是开还是关。
这将是理想的示例:
火技能:XXXXXXX1X1知识: 1X1XX1X1X1
在这个例子中,玩家将能够做@fire attack@,因为他的第一和第三位是打开的,即使玩家"知道"许多其他事情(第 10、8、5 位也打开)
将所有内容拆分为 10 个不同的字段不是一种选择,因为它已经工作并且需要大量工作来更改其他所有内容。
我希望你能帮助我,第一次问但多年使用堆栈溢出。
谢谢。
要测试掩码中的所有位是否都打开,请使用:
WHERE abilities & b'000000101' = b'000000101'
要测试是否有任何位打开,请使用:
WHERE abilities & b'000000101' != 0
要打开掩码中的所有位:
SET abilities = abilities | b'000000101'
要全部关闭它们:
SET abilities = abilities & ~b'000000101'
此处记录了这些位函数
在MySQL中,你可以通过以下方式比较位
SELECT (b'0000000101' & b'1010010101')
例如。
因此,要测试玩家是否懂冰,您可以按位和b'0000000010
当然,如果技能的数量超过了可用位数,您将需要进行更改。
要么咬紧牙关并添加额外的字段,要么使用更大的数据类型使表中的二进制字段更大。
第二个选项可能需要将旧数据类型转换为新数据类型。