如何統計位元串中連續的0或者1出現的次數

2021-08-23 14:12:26 字數 1067 閱讀 3079

眾所周知,計算機儲存資料是以二進位制01進行儲存的,但是我們平時程式設計所接觸的都是int,char等型別的資料,它們本身是包含多位位元,我們並不能直接對位元位進行類似int的操作。要對位元位進行操作通常要用到位操作,接下來我描述一種通過位操作來統計位元串中連續的0或者1出現的次數的方式。

定義原始位元串為 char *src,其中儲存了要處理的位元串。int bitslen 為位元串的長度。

bool flag;

if (*src &(1

<<7))

else

其中原始位元串是儲存在char陣列*src中的,所以將 *src &(1<<7),實際上就是將src[0]和10000000相與,若首位為1時結果不為0,否則結果為0。

u32 i;

bool flag1,flag2;

for (i=1;i8] &(1

<<(7-i%8)))&&flag;

flag2=(src[i/8] &(1

<<(7-i%8)))||flag;

if (flag1 || !flag2)

else

}

上一部分我們已經得到初始位置的位元值,同時賦予了flag乙個值,現在迴圈從第二個位元開始判斷也就是i = 1。當初始位元為1時,賦給true,0時賦false,接下來的位元同樣處理。例如當i = 1時,判斷第二個位元時,操作為src[i/8] &(1<<(7-i%8)),i = 1。這個操作會產生乙個值,將這個值和flag進行&&操作得到第二個bool值flag1,兩者相||得到第三個bool值flag2。將flag1和flag1進行 flag1 || !flag2 操作。如果為true就說明兩個位元是相同的,否則不同。

period記錄了連續相同位元出現的次數,當位元不同時,進入else操作,可以對需要的資料進行處理,文中進行了省略。之後將period置1,這個時候flag需要成為下一次迴圈判斷的起始位,很容易判斷得到這個時候的起始位元一定是與上一次相反的,所以直接將flag取反就可以了。迴圈一直到bitslen,但是有個地方需要注意,迴圈結束後還要再進行一次處理,用來處理最後一次連續出現的位元。

有趣的一道面試題,求連續的0或者連續的1的最大次數

給幾個0和1組成的字串,要求用程式算成連續的0或者連續的1的最大次數,例如 0011111000100100111 最大5 010011100001101100 最大4 00111110001001000000111 最大6 我寫了個oracle函式,勉強能實現這個功能,如下 create or r...

去掉字串中連續出現k個0的子串

去掉字串中連續出現k個0的子串 題目 給定乙個字串str和乙個整數k,如果str中正好有連續的k個 0 字元出現時,把k個連續的 0 去掉,返回處理後的字串。舉例 str a00b k 2,返回 a b str a0000b000 k 3,返回 a0000b 解答 使用變數count統計連續出現的0...

去掉字串中連續出現k個0的子串

題目 給定乙個字串str和乙個整數k,如果str中正好有連續的k個 0 字元出現時,把k個連續的 0 字元去除,返回處理後的字串。舉例 str a00b k 2,返回 a002 str a0000b000 k 3,返回 a0000b 難度 思路 對於處理字串各種問題,以前我都是以雙重巢狀著稱,時間複...