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博客的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: navigator工具_Javascri
- 下一篇: vs code ipynb文件_UE4引