日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言~991|4等于多少,复习C语言9-helloworld3000-ChinaUnix博客

發布時間:2024/7/23 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言~991|4等于多少,复习C语言9-helloworld3000-ChinaUnix博客 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于位操作

1. 不使用中間變量,交換a、b的值。

如使用:a = a + b; b = a - b; a = a - b;則當a、b都比較大時,a+b的值可能會溢出。而采用下述方法則沒有溢出越界的問題:

a = a ^ b;

b = a ^ b;

a = a ^ b;

證明其實很簡單,只要熟悉二進制運算就很容易了。令c=a^b,b(new)=c^b=a^b^b=a,a(new)=c^b(new)=a^b^a=b。

2. 計算一個整數對應二進制數中1的個數:

int num_of_1(int m)

{

int cnt =0;

while(m)

{

cnt++;

m = m&(m-1);

}

return cnt;

}

注:

(1)參數用int和unsigned int區別不是很大。

(2)m&(m-1)是消掉m最右面的一個1。

(3)一句話判斷k是不是2的冪:if(!(k & (k-1)))

附加:

const UINT32 m1 = 0x55555555;

const UINT32 m2 = 0x33333333;

const UINT32 m4 = 0x0f0f0f0f;

const UINT32 m8 = 0x00ff00ff;

const UINT32 m16 = 0x0000ffff;

int count_1(UINT32 x)

{

x = (x & m1) + ((x >> 1) & m1);

x = (x & m2) + ((x >> 2) & m2);

x = (x & m4) + ((x >> 4) & m4);

x = (x & m8) + ((x >> 8) & m8);

x = (x & m16) + ((x >> 16) & m16);

return x;

}

3. 翻轉一個字節

unsigned char reverse8 (unsigned char c)

{

c = (c & 0x55) << 1 | (c & 0xAA) >> 1;

c = (c & 0x33) << 2 | (c & 0xCC) >> 2;

c = (c & 0x0F) << 4 | (c & 0xF0) >> 4;

return c;

}

4. 如果一個字節的每一位代表一個狀態,那么len個狀態需要多少個字節

((len - 1) >> 3) + 1 /*len > 0*/

5. 如果字節數組的每一位代表一個狀態,返回第i個狀態(0,非0)

int ret_i_state(unsigned char * array, int i)

{

return array[i/8] & (1 << (i % 8));

}

總結

以上是生活随笔為你收集整理的c语言~991|4等于多少,复习C语言9-helloworld3000-ChinaUnix博客的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。