老程序猿的奇技淫巧们
首先声明:我不是老程序猿。
学JAVA出身,一直对C++之类的古老语言不感冒(喷这句话的程序员都是没前途的╮(╯_╰)╭),毕业了入手了一份c++服务器维护的活,干着吧,却也让我领略到老程序猿们的一些编程技巧。上网搜索了蛮多没看到类似的东西,就决定骚微分享一下了。
& 位与的小用法:
首先声明一个使用场景:
某聊天软件有各种钻石服务:普钻,红钻,黑钻和叼钻,所有用户都享受普钻服务,其他各种钻都是需要另外开通的。
那么我的数据表(特指关系型数据库)可能是这样的:
[accountid, 普钻,红钻,黑钻,叼钻]
(写到这里楼主已经不认识‘钻’字了)
如果老板今天心血来潮,说我们需要给土豪用户更好更周到的服务,于是数据表需要再增加一个字段--壕钻。
然后我想要分享的玩意,他的数据表是这样的:
[accountid, 各种钻]
不问各位是不是了,就是优雅很多╮(╯_╰)╭。
好了,接下来说做法:
我们取一串2的次方数:1,2,4,8,16……
设普钻为1,红钻为2,黑钻为4,叼钻为8,然后老板一声令下,咱又加了一个壕钻:16。
假设我们的大土豪用户x开通了所有的钻,那么数据表中[各种钻]应该为1+2+4+8。
今天他第一时间开通了壕钻:我们update 某数据表 set 各种钻 = 各种钻 + 16 where accountid = 大土豪。(希望没写错这个sql。。。)
然后大土豪的各种钻字段就变成了:1+2+4+8+16(楼主的小米系统居然没有计算器。。)
当我们需要判断大土豪是否开通了黑钻的时候,只需要判断 (黑钻 & 各种钻)!= 0 就可以了。
我说的太凌乱了╮(╯_╰)╭ 还是看看底下的代码吧。
a1 = 1; a2 = 2; a3 = 4; a4 = 8; a5 = 16; b1 = a1; b2 = a1 + a2; b3 = a2 + a4 + a5;
//判断加数中是否有a2 if((a2 & b1) != 0){print("我输出失败了!");}else{print("输出是我!");} if((a2 & b2) != 0){print("输出是我!");} if((a2 & b3) != 0){print("输出还是我!");}
这个东东的用途还是挺广的,比如复选框神马的。。(我可耻地只举出一个例子)
维护自家服务器的时候注意到的,让我想起来刚学程序那会,玩au3,au3很多函数传参会用到这招,把需要传入的参数相加就可以实现这些参数的功能。当时只知其然╮(╯_╰)╭ 好吧,顺便说说其所以然:
把这些数转成二进制就是:
1, 10, 100, 1000, 10000……
[1] [2] [4] [8] [16]
可以发现这些数中的1从左至右把每个位置都占了。竖着看
1-------------00001 2-------------00010 4-------------00100 8-------------01000 16------------10000
可以把二进制的1看作是一个list:它在第一个位上有东西,其他位置为空。
再给这个1加上4,:那么这个list就变成了第一个位和第三个位上都有东西了。
换句话说,给这些数相加,其实就是给这个二进制的list对应的位置本来为空的,加了点东西进去。
1+4=5 (00101)在1和3两个位置都有东西,而4(00100)在第三个位置上有东西,进行位与运算,就是4询问5(1+4):我表示第三个位置,你那里有东西么,有的话咱成交。
同样的,如果是2(00010)与1+4=5进行位与运算,2就会问5(1+4)要第二个位置的东西,5拿不出,于是谈判破裂。
具体位与是如何运算的,请移步:www.baidu.com
随性说了半天,也不管你们听没听懂了╮(╯_╰)╭ 只是觉得这东西很有价值,就想分享出来,笔力有限,大家见谅。