老程序猿的奇技淫巧们

首先声明:我不是老程序猿。

学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

随性说了半天,也不管你们听没听懂了╮(╯_╰)╭  只是觉得这东西很有价值,就想分享出来,笔力有限,大家见谅。

原文地址:https://www.cnblogs.com/LoadingChan/p/3583127.html