天天看點

老程式猿的奇技淫巧們

首先聲明:我不是老程式猿。

學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