用一个数字表示多个设置

2020-06-30 20:58:14 +08:00
 ladypxy

似乎是个基本的算法问题。。。 有 n 个设置,每个设置都有开关两个状态。现在需要用一个数字来代表这 n 个设置的开关情况 用 1 0 来表示肯定是可以的,但是我记得有个算法是用加法来做,每个设置用一个数字表示,然后把所有的设置的数字加起来,然后得到的 和 是唯一的。然后用这个 和 就可以得到每个设置的状态。

请问谁还记得这个计算方法。。。

1930 次点击
所在节点    算法
10 条回复
CismonX
2020-06-30 21:09:53 +08:00
bit masking
jmc891205
2020-06-30 21:15:57 +08:00
#define setting_A 1
#define setting_B 2
#define setting_C 4
#define setting_D 8

int setting = 0;
setting = setting_A + setting_C; // set A and C
klesh
2020-06-30 21:29:46 +08:00
用 位与 & 和 位或 |
算术加+是会出问题的
mlhorizon
2020-06-30 21:58:20 +08:00
加法的话基本上就是楼上说的掩码了。
不想用二进制的话,还有用质数乘法来做的。
Xusually
2020-06-30 22:08:07 +08:00
ladypxy
2020-06-30 22:38:07 +08:00
@jmc891205 感谢。就是每个 setting 都是前一个的 2 倍?
crab
2020-07-01 00:02:31 +08:00
位 权限
Shy07
2020-07-01 02:56:42 +08:00
最常见的应该是 16 进制颜色值吧

#FF8001

R: 0xFF8001 >> 16 & 0xFF // => 255
G: 0xFF8001 >> 8 & 0xFF // => 128
B: 0xFF8001 & 0xFF // => 1

(255 << 16) + (128 << 8) + 1 // => 0xFF8001
(255 << 16) | (128 << 8) | 1 // => 0xFF8001
Hyseen
2020-07-01 09:11:58 +08:00
参考 Linux 的权限设计,每个权限是 2 的幂次方
r: 4
w: 2
x: 1

如果权限为 5,则有:

5 & 4 != 0
5 & 2 == 0
5 & 1 != 0

说明有 r 和 x 的权限
itskingname
2020-07-01 09:25:42 +08:00
@ladypxy 准确的说,应该是
00001
00010
00100
01000
10000

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/686046

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX