摘要:程序輸出原理轉(zhuǎn)化為進(jìn)制為轉(zhuǎn)化為進(jìn)制為即是與將和中都為的位設(shè)為位數(shù)不夠的補(bǔ)即與運(yùn)算結(jié)果轉(zhuǎn)化為十進(jìn)制結(jié)果為應(yīng)用需求這是一個(gè)設(shè)置消息提醒的功能。這里有三種提醒方式郵箱提醒短信提醒微信公眾號(hào)提醒,用戶可以通過(guò)開(kāi)關(guān)按鈕控制某種提醒方式是開(kāi)啟還是關(guān)閉。
語(yǔ)法轉(zhuǎn)自我的github
&:and,按位與。以$a & $b為例,將$a和$b轉(zhuǎn)化為二進(jìn)制后,都為1的位設(shè)為1。
程序
$a = 6; $b = 3; var_dump($a & $b);
輸出:int(2)
原理
$a = 6轉(zhuǎn)化為2進(jìn)制為110
$b = 3轉(zhuǎn)化為2進(jìn)制為11
$a & $b即是 110 與 11
將$a和$b中都為1的位設(shè)為1,位數(shù)不夠的補(bǔ)0.即110 與 011
運(yùn)算結(jié)果010,轉(zhuǎn)化為十進(jìn)制結(jié)果為2
應(yīng)用 需求這是一個(gè)設(shè)置消息提醒的功能。我們假設(shè)這是一個(gè)blog系統(tǒng),用戶希望有人收藏自己的文章后,可以得到一個(gè)消息提醒。
這里有三種提醒方式:郵箱提醒、短信提醒、微信公眾號(hào)提醒,用戶可以通過(guò)開(kāi)關(guān)按鈕控制某種提醒方式是開(kāi)啟還是關(guān)閉??梢詤⒖家韵卤砀瘢?/p>
提醒操作 | 郵箱 | 短信 | 微信公眾號(hào) |
---|---|---|---|
文章被收藏 | 開(kāi)關(guān)按鈕 | 開(kāi)關(guān)按鈕 | 開(kāi)關(guān)按鈕 |
被關(guān)注 | 開(kāi)關(guān)按鈕 | 開(kāi)關(guān)按鈕 | 開(kāi)關(guān)按鈕 |
有人評(píng)論 | 開(kāi)關(guān)按鈕 | 開(kāi)關(guān)按鈕 | 開(kāi)關(guān)按鈕 |
1、數(shù)據(jù)庫(kù)設(shè)計(jì),表名(remind):
字段 | 數(shù)據(jù)類型 | 默認(rèn)值 |
---|---|---|
collection(文章被收藏) | int | default(0) |
followed(被關(guān)注 ) | int | default(0) |
commented(有人評(píng)論) | int | default(0) |
2、在Remind Model中設(shè)置執(zhí)行操作的提醒方式類型:
cosnt REMIND_NO = 0;//關(guān)閉所有的提醒 cosnt REMIND_EMAIL = 1;//郵箱提醒 2的0次方 轉(zhuǎn)化為二進(jìn)制是:1 cosnt REMIND_SMS = 2;//短信提醒 2的1次方 轉(zhuǎn)化為二進(jìn)制是:10 cosnt REMIND_WECHAT = 4;//微信公眾號(hào)提醒 2的2次方 轉(zhuǎn)化為二進(jìn)制是:100
如果有新的提醒方式值應(yīng)為4、8、16,依次類推,2的n次方。
仔細(xì)觀察二進(jìn)制轉(zhuǎn)化后
email第一位是1,sms第二位是1,wechat第三位是1.
即email占領(lǐng)了第一位、sms占領(lǐng)了第二位、wechat占領(lǐng)了第三位
1,代表開(kāi)啟提醒;0,代表關(guān)閉提醒
如果第一位是1,表示開(kāi)啟郵箱提醒;如果第一位是0,表示關(guān)閉郵箱提醒
假設(shè)用戶希望有人評(píng)論他的文章時(shí),收到來(lái)自系統(tǒng)的提醒:
只開(kāi)啟郵箱提醒,那數(shù)據(jù)庫(kù)中commented字段對(duì)應(yīng)的值應(yīng)是:1;轉(zhuǎn)化為二進(jìn)制:1
只開(kāi)啟短信提醒,那數(shù)據(jù)庫(kù)中commented字段對(duì)應(yīng)的值應(yīng)是:2;轉(zhuǎn)化為二進(jìn)制:10
只開(kāi)啟微信公眾號(hào)提醒,那數(shù)據(jù)庫(kù)中commented字段對(duì)應(yīng)的值應(yīng)是:4;轉(zhuǎn)化為二進(jìn)制:100
如果開(kāi)啟郵箱提醒和短信提醒,那數(shù)據(jù)庫(kù)中commented字段對(duì)應(yīng)的值應(yīng)是:1+2=3;轉(zhuǎn)化為二進(jìn)制:11
如果開(kāi)啟郵箱提醒和微信公眾號(hào)提醒,那數(shù)據(jù)庫(kù)中commented字段對(duì)應(yīng)的值應(yīng)是:1+4=5;轉(zhuǎn)化為二進(jìn)制:101
如果開(kāi)啟短信提醒和微信公眾號(hào)提醒,那數(shù)據(jù)庫(kù)中commented字段對(duì)應(yīng)的值應(yīng)是:2+4=6;轉(zhuǎn)化為二進(jìn)制:110
如果開(kāi)啟所有提醒,那數(shù)據(jù)庫(kù)中commented字段對(duì)應(yīng)的值應(yīng)是:1+2+4=7;轉(zhuǎn)化為二進(jìn)制:111
重點(diǎn)來(lái)了,前方高能,請(qǐng)注意啦~
3、控制器中寫(xiě)具體業(yè)務(wù)邏輯:
用戶希望有人關(guān)注他后,可以通過(guò)郵箱提醒他,所以用戶開(kāi)啟了郵箱提醒:
前端傳值:["option"=>"followed","type"=>"email"];
后端接收到參數(shù),從數(shù)據(jù)庫(kù)中找到當(dāng)前用戶的這一條數(shù)據(jù),得知followed字段值為0;
email對(duì)應(yīng)的值為1,進(jìn)行&運(yùn)算,判斷email提醒是否開(kāi)啟
1&0=0,所以未開(kāi)啟,那我們要開(kāi)啟email提醒,此時(shí)followed=0+1=1;
后來(lái)用戶覺(jué)得短信提醒比較直接,所以又開(kāi)啟了短信提醒:
前端傳值:["option"=>"followed","type"=>"sms"];
后端接收到參數(shù),從數(shù)據(jù)庫(kù)中找到當(dāng)前用戶的這一條數(shù)據(jù),得知followed字段值為1;
sms對(duì)應(yīng)的值為2,進(jìn)行&運(yùn)算,判斷sms提醒是否開(kāi)啟
2&1=0,所以未開(kāi)啟,那我們要開(kāi)啟sms提醒,此時(shí)followed=2+1=3;
后來(lái)該用戶越來(lái)越厲害,每天關(guān)注他的人特別多,每天都收到很多消息,所以他又想關(guān)閉短信提醒:
前端傳值:["option"=>"followed","type"=>"sms"];
后端接收到參數(shù),從數(shù)據(jù)庫(kù)中找到當(dāng)前用戶的這一條數(shù)據(jù),得知followed字段值為3;
sms對(duì)應(yīng)的值為2,進(jìn)行&運(yùn)算,判斷sms提醒是否開(kāi)啟
2&3=2,所以已開(kāi)啟,那我們要關(guān)閉sms提醒,此時(shí)followed=3-2=1;
部分程序代碼:
$option = $GET["option"];//提醒操作,由前端傳來(lái)的值 $type = $GET["type"];//提醒方式,由前端傳來(lái)的值 $remind = Remind::model()->find(1);//根據(jù)條件,在數(shù)據(jù)庫(kù)中找到的一條記錄 // 如果是提醒方式一 if ($type == "sms") { if ($remind->$option & Remind::REMIND_SMS) { // true 代表已開(kāi)啟sms提醒,此時(shí)應(yīng)關(guān)閉sms提醒 $remind->$option -= Remind::REMIND_SMS; } else if (!($remind->$option & Remind::REMIND_SMS)) { // false 代表已關(guān)閉sms提醒,此時(shí)應(yīng)開(kāi)啟sms提醒 $remind->$option += Remind::REMIND_SMS; } }總結(jié)
采用&運(yùn)算的好處:
減少了數(shù)據(jù)庫(kù)設(shè)計(jì)的復(fù)雜性,一張表即可搞定;不用一張表紀(jì)錄操作,另一張表紀(jì)錄提醒方式,然后再關(guān)聯(lián);
減少前端的判斷,前端只需將當(dāng)前的操作和其對(duì)應(yīng)的值傳給后端即可。
擴(kuò)展判斷某int型變量是奇數(shù)還是偶數(shù)
以$a為例
$a & 1 = 0,偶數(shù)
$a & 1 = 1,奇數(shù)
當(dāng)$a = 9時(shí):
$a & 1轉(zhuǎn)化為2進(jìn)制,1001&0001
結(jié)果為0001,轉(zhuǎn)化為十進(jìn)制為,1,所以是奇數(shù)
當(dāng)$a = 16 時(shí):
$a & 1轉(zhuǎn)化為2進(jìn)制,10000&00001
結(jié)果為00000,轉(zhuǎn)化為十進(jìn)制為,0,所以是偶數(shù)
仔細(xì)觀察,將十進(jìn)制轉(zhuǎn)化為二進(jìn)制,當(dāng)?shù)谝晃粸?的都是奇數(shù),第一位為0的都是偶數(shù)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/30363.html
摘要:的數(shù)據(jù)類型,共有六種。通常,數(shù)值字符串布爾值這三種類型,合稱為原始類型的值,即它們是最基本的數(shù)據(jù)類型,不能再細(xì)分了。運(yùn)算符返回一個(gè)布爾值,表示某個(gè)對(duì)象是否為指定的構(gòu)造函數(shù)的實(shí)例。 以下內(nèi)容摘自阮一峰-JavaScript-標(biāo)準(zhǔn)參考教程 數(shù)據(jù)類型 JavaScript 語(yǔ)言的每一個(gè)值,都屬于某一種數(shù)據(jù)類型。JavaScript 的數(shù)據(jù)類型,共有六種。(ES6 又新增了第七種 Symbo...
摘要:直接來(lái)看例子一目了然,第一個(gè)參數(shù)是對(duì)象,第二個(gè)參數(shù)可以是一系列的值,也可以是數(shù)組數(shù)組中含,也可以是迭代函數(shù),我們根據(jù)值,或者迭代函數(shù)來(lái)過(guò)濾中的鍵值對(duì),返回新的對(duì)象副本。 Why underscore 最近開(kāi)始看 underscore.js 源碼,并將 underscore.js 源碼解讀 放在了我的 2016 計(jì)劃中。 閱讀一些著名框架類庫(kù)的源碼,就好像和一個(gè)個(gè)大師對(duì)話,你會(huì)學(xué)到很多。...
摘要:昨天也是好好的看了一下的源碼,今天打算自己來(lái)做一下解析。源碼如下這段代碼真的是很短,但是方法真的很巧妙。因?yàn)閮蓚€(gè)方法用到了,這里把的源碼也貼出來(lái)源碼的描述就是為了執(zhí)行而創(chuàng)建的。最后再次感謝提供的思路。 原文鏈接,轉(zhuǎn)載請(qǐng)注明出處 最近看了Ma63d關(guān)于爬蟲(chóng)的這篇文章,正好自己也在做爬蟲(chóng),看到他在文中提到了co-parallel和co-gather,就打算改一下自己的代碼(本來(lái)代碼就只是為...
我有一群奇形怪狀的小伙伴,總會(huì)問(wèn)我一些奇形怪狀的問(wèn)題。 昨天有一個(gè)叫周三胖(因崇拜某國(guó)領(lǐng)導(dǎo)人以及結(jié)合其個(gè)人特點(diǎn)所以姓周,號(hào)三胖⊙﹏⊙)的朋友,向我發(fā)了這么一張圖片:showImg(https://segmentfault.com/img/bVPFiz?w=1148&h=96); 兄弟,上面那幾句什么意思? 呔!三胖休得坑貧道。老衲不會(huì)! 大哥,我是真不會(huì),求講解? %#@!#¥& ..... 經(jīng)過(guò)...
我有一群奇形怪狀的小伙伴,總會(huì)問(wèn)我一些奇形怪狀的問(wèn)題。 昨天有一個(gè)叫周三胖(因崇拜某國(guó)領(lǐng)導(dǎo)人以及結(jié)合其個(gè)人特點(diǎn)所以姓周,號(hào)三胖⊙﹏⊙)的朋友,向我發(fā)了這么一張圖片:showImg(https://segmentfault.com/img/bVPFiz?w=1148&h=96); 兄弟,上面那幾句什么意思? 呔!三胖休得坑貧道。老衲不會(huì)! 大哥,我是真不會(huì),求講解? %#@!#¥& ..... 經(jīng)過(guò)...
閱讀 3494·2021-11-12 10:36
閱讀 2873·2021-09-22 15:35
閱讀 2823·2021-09-04 16:41
閱讀 1173·2019-08-30 15:55
閱讀 3584·2019-08-29 18:43
閱讀 2079·2019-08-23 18:24
閱讀 1424·2019-08-23 18:10
閱讀 1926·2019-08-23 11:31