摘要:二進(jìn)制狀態(tài)碼存儲(chǔ)的主要好處是節(jié)省存儲(chǔ)空間,相對(duì)于鍵值對(duì)對(duì)象存儲(chǔ)而言可讀性較差當(dāng)然文件權(quán)限這種另說。所以注意如果后端返回二進(jìn)制狀態(tài)碼讓前端判斷,確保后端使用存儲(chǔ)完
我們知道計(jì)算機(jī)中數(shù)據(jù)都是用二進(jìn)制數(shù)存儲(chǔ)。二進(jìn)制數(shù)是一系列0和1的組合,長整型64位,最短的字節(jié)型也有8位。其中每一位0和1都可以看做一種狀態(tài)的開和關(guān),所以就有了這樣的一種狀態(tài)碼存儲(chǔ)方式:把同一對(duì)象的多種狀態(tài)按位組合到一個(gè)整數(shù)中。
例如我們最最常見的 *nix 文件權(quán)限:
第9位 | 第8位 | 第7位 | 第6位 | 第5位 | 第4位 | 第3位 | 第2位 | 第1位 | 第0位 |
---|---|---|---|---|---|---|---|---|---|
是否目錄 | 所有者讀權(quán)限 | 所有者寫權(quán)限 | 所有者執(zhí)行權(quán)限 | 組讀權(quán)限 | 組寫權(quán)限 | 組執(zhí)行權(quán)限 | 其余用戶讀權(quán)限 | 其余用戶寫權(quán)限 | 其余用戶執(zhí)行權(quán)限 |
0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
那么這一組狀態(tài)在程序中表示為:0b0111101101,即八進(jìn)制的 0o755,十進(jìn)制的 493。
二進(jìn)制狀態(tài)碼存儲(chǔ)的主要好處是節(jié)省存儲(chǔ)空間,相對(duì)于鍵值對(duì)(對(duì)象)存儲(chǔ)而言可讀性較差(當(dāng)然文件權(quán)限這種另說)。這種存儲(chǔ)方式僅適用于“一個(gè)對(duì)象有多種狀態(tài),每種狀態(tài)僅有兩種情況”這一情形,請(qǐng)不要對(duì)一種狀態(tài)多種情況的情形使用二進(jìn)制狀態(tài)碼存儲(chǔ)方式,更不要出現(xiàn)十進(jìn)制的 0 1 10 這種狀態(tài)碼,很蠢。。。
使用位運(yùn)算操作狀態(tài)碼基于這種存儲(chǔ)方式,也衍生了一些操作狀態(tài)碼的方式:
判斷第 x 位狀態(tài)是否開啟(x 以 0 開始,下同):status & (1 << x) == 0 // bt ( bit test )打開第 x 位
status |= 1 << x // bts ( bit test and set )重置第 x 位
status &= ~(1 << x) // btr ( bit test and reset )取反第 x 位
status ^= 1 << x // btc ( bit test and complement )編程語言支持
某些編程語言提供了對(duì)二進(jìn)制狀態(tài)碼的一些原生支持。C/C++ 提供了 位域,以及專門的模板庫 bitset 用于簡化位運(yùn)算操作。C# 則提供了 Flags 特性標(biāo)記某個(gè)枚舉被視作位域
另外很重要一點(diǎn),JavaScript 雖然也支持位運(yùn)算,但由于 JavaScript 中的 number 類型都是雙精度浮點(diǎn)數(shù),在做位運(yùn)算時(shí)會(huì)先將數(shù)值截?cái)嘀?32 位長度。例如很著名的數(shù)字轉(zhuǎn)整數(shù)bug:10000000000 | 0 => 1410065408。所以注意如果后端返回二進(jìn)制狀態(tài)碼讓前端判斷,確保后端使用 uint32_t 存儲(chǔ)
完文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/101500.html
摘要:狀態(tài)碼當(dāng)關(guān)閉一個(gè)連接時(shí)如在開始握手已經(jīng)完成后,發(fā)送一個(gè)關(guān)閉幀,終端可能會(huì)說明關(guān)閉的原因。表示終端由于協(xié)議錯(cuò)誤中止了連接。這個(gè)狀態(tài)碼是為了給上層應(yīng)用表示連接被異常關(guān)閉如沒有發(fā)送或者接受一個(gè)關(guān)閉幀這種場(chǎng)景的使用而設(shè)計(jì)的。 概述 本文為 WebSocket 協(xié)議的第七章,本文翻譯的主要內(nèi)容為 WebSocket 連接關(guān)閉相關(guān)內(nèi)容。 關(guān)閉連接(協(xié)議正文) 7.1 定義 7.1.1 關(guān)閉 Web...
摘要:現(xiàn)在解釋和正則匹配中的轉(zhuǎn)義字符之間的關(guān)系其實(shí)中的轉(zhuǎn)義字符和正則中的轉(zhuǎn)義字符是同一樣?xùn)|西,都是特殊意義的字符,也算對(duì)中一些特殊字符或不能顯示的字符的定義或別稱。 1、正則表達(dá)式的組合 正則表達(dá)式由元字符和轉(zhuǎn)義字符組成 元字符有 ^ :斷言目標(biāo)的開始位置(或多行模式下的行首位置) $ :斷言目標(biāo)的介紹位置(或多行模式下的結(jié)尾位置) . :匹配除換行符外的其他任何字符 [ :匹配字...
摘要:狀態(tài)碼有哪些一般大家都知道頁面不存在,服務(wù)器錯(cuò)誤,重定向,臨時(shí)重定向,,未授權(quán)啥的??偨Y(jié)僅僅三個(gè)狀態(tài)碼,都可以牽涉到如此豐富的知識(shí),對(duì)于狀態(tài)碼,我們不能只是片面的去背誦狀態(tài)碼及對(duì)應(yīng)的含義,要去主動(dòng)挖掘,深入,借助狀態(tài)碼來建立自己的網(wǎng)絡(luò)體系。 之前寫的一些筆記,簡單記錄在這里。 http狀態(tài)碼有哪些? 一般大家都知道404頁面不存在,500服務(wù)器錯(cuò)誤,301重定向,302臨時(shí)重定向,2...
摘要:背景狀態(tài)碼有哪些,這也是一個(gè)很高頻的面試問題??偨Y(jié)僅僅三個(gè)狀態(tài)碼,都可以牽涉到如此豐富的知識(shí),對(duì)于狀態(tài)碼,我們不能只是片面的去背誦狀態(tài)碼及對(duì)應(yīng)的含義,要去主動(dòng)挖掘,深入,借助狀態(tài)碼來建立自己的網(wǎng)絡(luò)體系。 背景 http狀態(tài)碼有哪些,這也是一個(gè)很高頻的面試問題。一般大家都知道404頁面不存在,500服務(wù)器錯(cuò)誤,301重定向,302臨時(shí)重定向,200ok,401未授權(quán)啥的。 如果只是簡單的...
摘要:數(shù)據(jù)幀協(xié)議正文概覽在協(xié)議中,數(shù)據(jù)是通過一系列數(shù)據(jù)幀來進(jìn)行傳輸?shù)摹W⒁鉄o論協(xié)議是否使用了,幀都需要添加掩碼。服務(wù)端收到?jīng)]有添加掩碼的數(shù)據(jù)幀以后,必須立即關(guān)閉連接。服務(wù)端禁止在發(fā)送數(shù)據(jù)幀給客戶端時(shí)添加掩碼。 概述 本文為WebSocket協(xié)議的第五章,本文翻譯的主要內(nèi)容為WebSocket傳輸?shù)臄?shù)據(jù)相關(guān)內(nèi)容。 數(shù)據(jù)幀(協(xié)議正文) 5.1 概覽 在WebSocket協(xié)議中,數(shù)據(jù)是通過一系列數(shù)...
閱讀 2446·2021-08-18 10:21
閱讀 2551·2019-08-30 13:45
閱讀 2184·2019-08-30 13:16
閱讀 2147·2019-08-30 12:52
閱讀 1388·2019-08-30 11:20
閱讀 2656·2019-08-29 13:47
閱讀 1647·2019-08-29 11:22
閱讀 2788·2019-08-26 12:11