成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

&運(yùn)算符的巧妙應(yīng)用

Coding01 / 3563人閱讀

摘要:程序輸出原理轉(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)閉。

轉(zhuǎn)自我的github

語(yǔ)法

&: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即是 11011

將$a和$b中都為1的位設(shè)為1,位數(shù)不夠的補(bǔ)0.即110011

運(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)按鈕
實(shí)現(xià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、816,依次類推,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

相關(guān)文章

  • JS數(shù)據(jù)類型& 判斷

    摘要:的數(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...

    zhangxiangliang 評(píng)論0 收藏0
  • 【underscore 源碼解讀】Object Functions 相關(guān)源碼拾遺 & 小結(jié)

    摘要:直接來(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é)到很多。...

    neuSnail 評(píng)論0 收藏0
  • co-parallel & co-gather源碼解析

    摘要:昨天也是好好的看了一下的源碼,今天打算自己來(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)代碼就只是為...

    caozhijian 評(píng)論0 收藏0
  • 淺談邏輯運(yùn)算符&&(與)和 ||(或)

    我有一群奇形怪狀的小伙伴,總會(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ò)...

    xiyang 評(píng)論0 收藏0
  • 淺談邏輯運(yùn)算符&&(與)和 ||(或)

    我有一群奇形怪狀的小伙伴,總會(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ò)...

    RdouTyping 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<