這幾天還是在看線段樹部分,例題之類的,
發現大佬們大都用位運算子。
1.位左移
左移運算的實質是將對應的資料的二進位制值逐位左移若干位,並在空出的位置上填0,最高位溢位並捨棄。例如int a,b;
a=5;
b=a<<2;
則b=20,分析過程如下:
(a)10=(5)10=(0000 0000 0000 0101)2
b=a<<2;
b=(0000 0000 0001 0100)2=(20)10
從上例可以看出位運算可以實現二倍乘運算。由於位移操作的運算速度比乘法的運算速度高很多。因此在處理資料的乘法運算的時,採用位移運算可以獲得較快的速度。
提示 將所有對2的乘法運算轉換為位移運算,可提高程式的執行效率
2.位右移
位右移運算的實質是將對應的資料的二進位制值逐位右移若干位,並捨棄出界的數字。如果當前的數為無符號數,高位補零。例如:
int (a)10=(5)10=(0000 0000 0000 0101)2
b=a>>2;
b=(0000 0000 0000 0001)2=(1)10
如果當前的資料為有符號數,在進行右移的時候,根據符號位決定左邊補0還是補1。如果符號位為0,則左邊補0;但是如果符號位為1,則根據不同的計算機系統,可能有不同的處理方式。可以看出位右移運算,可以實現對除數為2的整除運算。
提示 將所有對2的整除運算轉換為位移運算,可提高程式的執行效率
3.復合的位運算子
在c語言中還提供復合的位運算子,如下:
&=、!=、>>=、<<=和^=
例如:a&=0x11等價於 a= a&0x11,其他運算子以此類推。
不同型別的整數資料在進行混合型別的位運算時,按右端對齊原則進行處理,按資料長度大的資料進行處理,將資料長度小的資料左端補0或1。例如char a與int b進行位運算的時候,按int 進行處理,char a轉化為整型資料,並在左端補0。
補位原則如下:
1) 對於有符號資料:如果a為正整數,則左端補0,如果a 為負數,則左端補1。
2) 對於無符號資料:在左端補0。
關於線段樹的具體的題解有機會我再詳細的寫一寫,心好累,,,,這題好難做,,,,,雖然都是些模板題。。。但是不好做啊。。
暑假訓練總結 SSL暑假訓練總結
第一周過的還算好吧,覺得飯堂伙食也挺好的,同學也挺好。學習的東西感覺比小學難好多,有種覺得以前學的東西太簡單了的感覺,但多虧了小學的時候基礎打得還算紮實,學得還行,但總是感覺自己就是個菜雞,就是乙個蒟蒻,哎,室友真的太強了。第一周總結 第二週自我感覺挺不錯的,總算追上了部分室友,成績也開始 這一切都...
拓展訓練總結
拓展訓練總結 2006年4月30日至5月1日,我參加人眾人公司的 團隊協作 拓展訓練,在拓展訓練結束之後,雖然是身心俱疲,但感想頗多,特總結如下 一 關於拓展訓練 拓展是近年頗流行的時尚休閒方式,在教練的介紹下,我才知道它的由來 拓展英文為 outward development 中文譯為 拓展 或...
2017 1 13訓練總結
problem 0 給出乙個長度為n的序列a 1.n 將其變成序列b 1.n 的代價為 n i 1 a i b i 要使b 1.n 成為乙個不下降序列,問最小的代價 1 n 104 solution 這道題和之前做過的一道題很像,我的做法是用splay維護dp的陣列,打了二十多分鐘,還挺順的。pro...