1.定義:位運算通常是指對二進位制數的運算。常見的位運算子有
(1)& 按位與 全一則一
(2)| 按位或 有一則一
(3)^按位異或 相同位上不一樣則為1
(4)~取反,將0變成1,將1變成0.
(3)<< 左移 m<<1是將m轉化成2進製數,向左移動一位丟棄高位,低位補零。
左移就相當於乘以2的n次方。
eg: 將十進位制3左移4位,則有: 3<<4就等於將0000 0011左移4位。即0011 0000
(4)>> 右 移 m<<1是將m轉化成2進製數 向右移動一位.
右移就相當於除以2的n次方。丟棄低位,高位補符號位。
對於有符號數時,在右移時,符號位將跟隨移動。當為正數時,最高位補0;當為負數時,符號位補1.
eg: 將15右移兩位,即0000 1111>>2,則有 0000 0011
2.按位運算規則
(1) 將第k位變1:
按位或 1。因為0和任何數字按位或都不變,1和任何數字按位或都為1.
(2)將第k位變成0:
按位與0。因為0和任何數字按位與都變0,1和任何數字按位與都不變
(3)將第k位取反:
按位異或 .因為0和任何數字按位異或都不變,1和任何數字按位異或都取反
總規則: 1.確定符號2.確定數字3.構造數字
3.有關位運算的演算法(一位元組)
1.將ch的 二進位制右數第n位置 1(n從1開始)
int getbits( char *ch,int n)//0101 0010->0101 0110
*ch|=1<
return ture;
}
2.獲取ch的 二進位制右數第n位置 的值(n從1開始)
int getbits( char ch,int n)
return (ch>>(n-1))&1);
}
3.將ch的 二進位制右數第n位清 0(n從1開始)
int getbits( char *ch,int n)
*ch&=~(1<
}
4.位反轉 (按位取反)
unsigned int getbits(unsigned int n)
}return tmp;
}
讓人頭大的leetcode刷題之旅
水平不高,單純記錄一下leetcode刷題,也督促一下自己。1.兩數之和 一開始刷leetcode,引數都搞不清楚,摸索了好久才知道怎麼寫。這裡函式內部的malloc還需要在外部呼叫後釋放。note the returned array must be malloced,assume caller ...
leetcode之令人頭大的有限狀態自動機
今日打卡一題是leetcode 8.字串轉換整數 atoi 但從題目看來,感覺挺簡單呀,這不就是語言裡面會自帶的atoi函式嗎?跟傳說中編譯原理中的自動機有什麼關係,做題要不要這麼博學。其實由於將字串轉換成整數的時候限制條件有很多個,流程複雜。所以使用有限狀態自動機可以梳理開始和結束,中間各種條件轉...
讓人頭疼的遞迴演算法
遞迴,一般指函式的定義中使用函式自身的方法。也就是說,遞迴演算法是一種直接或者間接呼叫自身函式方法的演算法。實質上是把問題分解成規模縮小的同類問題的子問題,然後遞迴呼叫方法來表示問題的解。基本原理 1.每一級的函式呼叫都有自己的變數。2.每一次函式呼叫都會有一次返回。3.遞迴函式中位於遞迴呼叫前的語...