可以解释为不同事物的单一存储值
Single storage value that can be interpreted to mean different things
我想看看是否有办法将单个值存储在数据库的一列中,但在读取时它可能被解释为数据库中的四列。
我有正方形,它有四个边。我想存储一个值,告诉我哪些边应该有虚线。当读取这个值时,我可以很容易地破译像左边和右边应该是破折号,或者只是顶部,或者所有的边,或者 none.
我知道我可以说我可以存储 17 个选项,但是有没有更简单的方法来使用数字?我将在界面中有四个按钮,显示他们想要在哪一边加点,并以这种方式存储一个值。
有没有办法在存储和重新解释部分的一些伪代码中向我展示这一点?
双方有 16 种可能性——每一方都有两种可能性,每个决定都独立于其他决定,所以你将数字相乘,得到 2*2*2*2=16
。
您可以只存储 0
和 15
之间的整数。要获得左侧的选择,请计算 n & 1
,其中 n
是存储的数字。 (“&”符号在许多计算机语言中表示 "bitwise and"。)结果 1
表示虚线,而 0
表示实线。要得到右侧,计算n & 2
,顶部是n & 4
,而底部是n & 8
。请注意,这些公式中的 "magic numbers" 是 2**0
、2**1
、2**2
和 2**3
。
你可以轻松地走另一条路。如果表示为 0
或 1
的选择是 a,b,c,d
,则 n = 1*a + 2*b + 4*c + 8*d
。请注意与上一段中相同的幻数。
如果您知道二进制数字系统,那么这些公式就很明显了。如果您想了解更多信息,请在 "binary number".
上进行网络搜索
当然,另一种解决问题的方法是存储 string 值而不是整数。例如,您可以存储
"left=dashed, right=solid, top=solid, bottom=dashed"
并使用您的语言的字符串处理工具来解析字符串。这是一个比我的第一种方法更长的过程,并且使用更多的内存来存储,但它的优点是更加透明并且对于检查数据的任何人来说都易于理解。
你在评论中使用像 "1101"
这样的短字符串的想法是一个很好的想法,并且根据实施情况,它甚至可能比我的第一个解决方案使用更少的内存。它显示的信息量与我的第一个解决方案相同,但少于我的第二个。你的想法和其他想法的实现取决于语言以及你如何将每一方的决定存储在变量中。在 Python 中,如果 n
是存储的(字符串)值并且每边的决策都是布尔变量 a,b,c,d
(True
表示虚线,False
表示实线), 你的代码可以是
a = (n[0] == '1')
b = (n[1] == '1')
c = (n[2] == '1')
d = (n[3] == '1')
在 Python 中有更短的方法可以做到这一点,但它们对非 Python 程序员来说不太容易理解。
我想看看是否有办法将单个值存储在数据库的一列中,但在读取时它可能被解释为数据库中的四列。
我有正方形,它有四个边。我想存储一个值,告诉我哪些边应该有虚线。当读取这个值时,我可以很容易地破译像左边和右边应该是破折号,或者只是顶部,或者所有的边,或者 none.
我知道我可以说我可以存储 17 个选项,但是有没有更简单的方法来使用数字?我将在界面中有四个按钮,显示他们想要在哪一边加点,并以这种方式存储一个值。
有没有办法在存储和重新解释部分的一些伪代码中向我展示这一点?
双方有 16 种可能性——每一方都有两种可能性,每个决定都独立于其他决定,所以你将数字相乘,得到 2*2*2*2=16
。
您可以只存储 0
和 15
之间的整数。要获得左侧的选择,请计算 n & 1
,其中 n
是存储的数字。 (“&”符号在许多计算机语言中表示 "bitwise and"。)结果 1
表示虚线,而 0
表示实线。要得到右侧,计算n & 2
,顶部是n & 4
,而底部是n & 8
。请注意,这些公式中的 "magic numbers" 是 2**0
、2**1
、2**2
和 2**3
。
你可以轻松地走另一条路。如果表示为 0
或 1
的选择是 a,b,c,d
,则 n = 1*a + 2*b + 4*c + 8*d
。请注意与上一段中相同的幻数。
如果您知道二进制数字系统,那么这些公式就很明显了。如果您想了解更多信息,请在 "binary number".
上进行网络搜索当然,另一种解决问题的方法是存储 string 值而不是整数。例如,您可以存储
"left=dashed, right=solid, top=solid, bottom=dashed"
并使用您的语言的字符串处理工具来解析字符串。这是一个比我的第一种方法更长的过程,并且使用更多的内存来存储,但它的优点是更加透明并且对于检查数据的任何人来说都易于理解。
你在评论中使用像 "1101"
这样的短字符串的想法是一个很好的想法,并且根据实施情况,它甚至可能比我的第一个解决方案使用更少的内存。它显示的信息量与我的第一个解决方案相同,但少于我的第二个。你的想法和其他想法的实现取决于语言以及你如何将每一方的决定存储在变量中。在 Python 中,如果 n
是存储的(字符串)值并且每边的决策都是布尔变量 a,b,c,d
(True
表示虚线,False
表示实线), 你的代码可以是
a = (n[0] == '1')
b = (n[1] == '1')
c = (n[2] == '1')
d = (n[3] == '1')
在 Python 中有更短的方法可以做到这一点,但它们对非 Python 程序员来说不太容易理解。