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