最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

C語言 int 整型轉(zhuǎn)換為 2 進制字符串__按位操作實現(xiàn)

2023-01-02 08:31 作者:鳧水億  | 我要投稿

編譯器版本:?gcc.exe (Rev3, Built by MSYS2 project) 12.1.0

windows 版本: win11

VsCode版本:?1.70.1 (system setup)

經(jīng)過幾個月的刻苦學(xué)習(xí),對 C 語言有有了新的了解,在本文中,將使用按位操作將 int 整型轉(zhuǎn)換為 2 進制字符串?;逎y懂的部分將給出解釋,看不懂的地方可以多看幾遍,或者在評論區(qū)進行討論。


設(shè)計思路

在計算機中所有的數(shù)據(jù)都以 2 進制的形式儲存,int 整型也不例外,我們以高位向低位的順序依次讀取每一位的數(shù)據(jù),再將數(shù)據(jù)映射到 2 進制字符串中。無論在?win32 還是?win64 中,int 都以 4 字節(jié) (Byte) 大小進行儲存,每一個字節(jié) (Byte) 占用 8 比特 ( bit ),數(shù)據(jù)位一共為 32 bit,即 32 位,我們知道 32 位的數(shù)據(jù)一共可以表示 2^32 次方個數(shù),通過 32 個不同位置的 bit?進行表示。

8bit數(shù)據(jù)存儲展示圖


那么,要如何讀取特定位置的信息呢?在 C?語言中,提供了一些按位操作符:&(按位與),|(按位或),^(按位異或) ,<<(左移),>>(右移),通過常用的這五個操作符,可以將特定位置的數(shù)據(jù)讀取出來,如果想要查看更多按位操作符,可以在 <iso646.h> 頭文件中查看,這里不在贅述。按位操作是有使用前提條件的,按位操作只對整型變量有意義,對其他如浮點型數(shù)據(jù)無意義,浮點類型數(shù)據(jù)以另一種方式進行存儲。接下來簡述這五個按位操作符的運算原則:按位與 —— &,雙目運算符,兩個相同位置上數(shù)的位運算,兩者為 1 ,結(jié)果為1。

8bit按位與運算

按位或—— |,雙目運算符,兩個相同位置上數(shù)位運算,其中一者為 1,結(jié)果為 1。

8bit按位或運算

按位異或—— ^,雙目運算符,兩個相同位置上數(shù)位運算,不帶進位的加法。

8bit按位異或運算

左移——<<,雙目運算符,將所有位向左移動 n 位,如 93 << 2,低位補零,高位銷毀。

93 << 2

右移——>>,雙目運算符,將所有的位向右移動 n 位,如 93 >> 2,高位補零,低位銷毀。

93 >> 2

如上圖所示,如果我們想提取數(shù)?93 第 7 位的數(shù)據(jù),先使用按位或?qū)⒌?6?位置 1,第 8 位置 1,然后使用按位異或?qū)⒌?6 位置 0,第 8 位置 0 ,最后使用移位,將第 7 位數(shù)據(jù)移動到第 1 位即可知道該位是 1 還是 0。

獲取第 7 位的數(shù)據(jù)

通過這種方法,可以讀取任意位置的數(shù)據(jù)。我們從高位向低位讀取數(shù)據(jù),這樣方便字符數(shù)組存儲數(shù)據(jù)。

映射

代碼實現(xiàn)

int 整型占用 4 字節(jié) 32 位,如果使用外部字符數(shù)組接收,其長度應(yīng)當(dāng)大于 32 ,但在實際開發(fā)過程中,我們?yōu)榱四軌蚋脙?yōu)化代碼,在函數(shù)內(nèi)部定義了一個臨時字符數(shù)組,其長度為 64,因此當(dāng)外部數(shù)組的長度小于 64 時,函數(shù)退出,這是為了保證字符串?dāng)?shù)組不被截斷或者溢出。

判斷應(yīng)當(dāng)位于所有入棧數(shù)據(jù)之前,當(dāng)發(fā)生錯誤時,不會因為其余數(shù)據(jù)入棧出棧而占用時間、空間上的開銷。

我們知道函數(shù)出棧后,數(shù)據(jù)就會被丟棄,可以通過傳遞二級指針來實現(xiàn)函數(shù)內(nèi)部操作外部數(shù)據(jù)。這是函數(shù)聲明:

形參 number?不是無符號 int,其高位表示這個數(shù)是否為負(fù)數(shù),高位為 1 時,這個數(shù)為負(fù)數(shù),高位為 0 時這個數(shù)為正數(shù),但是這種讀取原則,可能干擾我們轉(zhuǎn)換為 2 進制的思路,可以將接收進來的 number 使用 unsigned int 接收,2 進制是不分正負(fù)的,當(dāng)一個特殊需求產(chǎn)生時,任何一個位都可以當(dāng)做正負(fù)號。

無論在 win32,還是 win64 平臺中,int 都是 4 字節(jié),為了保險起見,我們使用 sizeof() 獲取占用的空間大小,* 8 是得到所有的 bit 數(shù)目。

這是代碼核心的部分,為了讀取特定位的數(shù)據(jù),我們需要兩把刷子,將位左右的數(shù)據(jù)清洗掉。

數(shù)據(jù)清洗

代碼最關(guān)鍵的部分,我們使用 i,j,分別指定左邊刷子和右邊刷子的位置,在系統(tǒng)中,如果直接左移或者右移 32 位,系統(tǒng)就會認(rèn)定數(shù)據(jù)回到了原來的位置,所以位置不變,為了避免這種情況發(fā)生,我們先移動 31 位,再移動 1 位,移動其他位數(shù)時,不會產(chǎn)生影響。

左刷子 bitwiseLeft 是通過 0xFFFFFFFF 向左移 i 而得到的,在程序中刷子的位置是根據(jù) i 定位的,i 隨著程序運行逐漸變小,刷子逐漸向右移動。

右刷子 bitwiseRight 通過?0xFFFFFFFF 向右移 i 得到,在程序中刷子的位置根據(jù) j 定位,j 隨著程序運行而變大,刷子逐漸向右移動。

兩個刷子中間總是保留一位的數(shù)據(jù)供讀取。其運行軌跡如下圖。

刷子移動方向

將刷子的行為細(xì)分,它其實分兩個動作的,第一步,將不要的數(shù)據(jù)刷上漆,第二步,將刷漆的部分扯下來;它所對應(yīng)的部分是?(_number?|?bitwiseRight)?|?bitwiseLeft 刷左漆與右漆,^?bitwiseLeft?+?bitwiseRight 將刷漆的部分扯下來。剩下的就是要提取的數(shù)據(jù),該數(shù)據(jù)的位置通過 i 鎖定,右移 i ,就可以將其移動到第一位,其值為 1 或 0,將其轉(zhuǎn)換為字符 1 或者 0,需要加上 48 ,字符 '0' 的 ASCII 編碼為 48,字符 '1' 的 ASCII 編碼為 49,通過加上常數(shù) 48 就可轉(zhuǎn)換為字符了,左邊?binary 數(shù)組的索引是 j ,j 隨著程序運行而增大,從 0 開始,至 31 結(jié)束,可以保存 32 位 2 進制值。

最后通過字符串復(fù)制函數(shù)將字符串復(fù)制到外部字符數(shù)組中。*recvArray 取 2 級指針的值,即外部字符數(shù)組的地址。


視覺優(yōu)化

到這里應(yīng)該就結(jié)束了,但實際運行中會出現(xiàn)很多 0 ,如輸入17?得到 00000000000000000000000000010001,我們可以通過簡單的語句將 0 消除,得到 10001。

感興趣的朋友可以研究一下這段代碼,說不定有意外收獲,解答在代碼展示下面。


代碼展示


解答

在 for 括號中,定義了 size_t 類型的變量,它和指針類型的長度是一致的。所以 j = (size_t)--pValidChar 是不會報錯的。

在括號中,定義了 i,j 兩個變量,通過判斷兩個變量值是否一致來決定函數(shù)出口,for 循環(huán)中只有一句語句,這句語句本質(zhì)上是一個三目運算,它分為判斷語句??*pValidChar ++ == 49 ,? 后面會有兩個分支,第一個分支是 ??與 : 中間的部分,它可以是一個表達式,也可以是一個值,第二個分支是 : 與?; 中間的部分,它可以是一個表達式,也可以是一個值。當(dāng)前面判斷語句結(jié)果為 true 時,返回第一個分支的值,若為 false 返回第二個分支的值;在此句中沒有變量接收返回的值,所以值會被丟棄;在兩個分支中還可以使用帶返回值的函數(shù)如 printf();

17 轉(zhuǎn)換為:10001 產(chǎn)生的輸出

在三目運算符中?j = (size_t)--pValidChar 運算是被允許的,但 j = printf("hello j:%lld\n") 就會報錯。


C語言 int 整型轉(zhuǎn)換為 2 進制字符串__按位操作實現(xiàn)的評論 (共 條)

分享到微博請遵守國家法律
龙海市| 安福县| 黄平县| 元阳县| 卢湾区| 永吉县| 大名县| 克东县| 卢龙县| 延寿县| 威宁| 宁陕县| 松桃| 修文县| 临沧市| 呼图壁县| 黑水县| 商城县| 昌平区| 井陉县| 邢台市| 博野县| 芮城县| 蚌埠市| 庆城县| 将乐县| 城固县| 资阳市| 安化县| 塘沽区| 阿克| 宁城县| 鞍山市| 新闻| 合水县| 萝北县| 桂阳县| 左贡县| 汤阴县| 雅江县| 阿尔山市|