位操作學習的一些困惑
對於移位操作,在微軟的VC6.0和VS2008編譯器都是採取算術稱位即算術移位操作,算術移位是相對於邏輯移位,它們在左移操作中都一樣,低位補0即可,但在右移中邏輯移位的高位補0而算術移位的高位是補符號位。如下面程式碼會輸出-4和3。
#include <stdio.h>
#include <math.h>
int main(){
int a = -15, b = 15;
printf("%d %d\n", a >> 2, b >> 2);
return 0;
}
因為15=0000 1111(二進位制),右移二位,最高位由符號位填充將得到0000
0011即3。-15 = 1111 0001(二進位制),右移二位,最高位由符號位填充將得到1111 1100即-4。
變換符號
變換符號就是正數變成負數,負數變成正數。
如對於-11和11,可以通過下面的變換方法將-11變成11
1111 0101(二進位制) –取反-> 0000 1010(二進位制) –加1-> 0000 1011(二進位制)
同樣可以這樣的將11變成-11
0000 1011(二進位制) –取反-> 1111 0100(二進位制) –加1-> 1111 0101(二進位制)
因此變換符號只需要取反後加1即可。完整程式碼如下
#include <stdio.h>
int SignReversal(int a)
{
return ~a + 1;
}
int main()
{
printf("對整數變換符號 --- by MoreWindows( http://blog.csdn.net/MoreWindows ) ---\n\n");
int a = 7, b = -12345;
printf("%d %d\n", SignReversal(a), SignReversal(b));
return 0;
}
求絕對值
位操作也可以用來求絕對值,對於負數可以通過對其取反後加1來得到正數。對-6可以這樣:
1111 1010(二進位制) –取反->0000 0101(二進位制) -加1-> 0000 0110(二進位制)
來得到6。
因此先移位來取符號位,int i = a >> 31;要注意如果a為正數,i等於0,為負數,i等於-1。然後對i進行判斷——如果i等於0,直接返回。否之,返回~a+1。完整程式碼如下:
//by MoreWindows( http://blog.csdn.net/MoreWindows )
int my_abs(int a)
{
int i = a >> 31;
return i == 0 ? a : (~a + 1);
}
現在再分析下。對於任何數,與0異或都會保持不變,與-1即0xFFFFFFFF異或就相當於取反。因此,a與i異或後再減i(因為i為0或-1,所以減i即是要麼加0要麼加1)也可以得到絕對值。所以可以對上面程式碼優化下:
//by MoreWindows( http://blog.csdn.net/MoreWindows )
int my_abs(int a)
{
int i = a >> 31;
return ((a ^ i) - i);
}
相關文章
- 學習java的困惑Java
- postgreSQL學習(二):pgsql的一些基礎操作SQL
- 機器學習中那些必要又困惑的數學知識機器學習
- C++運算子過載的一些困惑C++
- 重新學習Java的第1天——一些普通的操作和java的一些知識Java
- 【譯】關於Webpack中一些讓人困惑的地方的解答Web
- [原創]成立售後服務部門的一些困惑
- 深度學習的一些思考深度學習
- strtotime 的困惑
- 分享一些自己的學習過程和學習方法
- 學習 CodeWhisperer 的一些總結
- 對於學習的一些思考
- 學習Python的一些小筆記Python筆記
- 《考試腦科學》_解答我多年前在學習和應試中存在的困惑
- linux學習筆記---一些命令學習Linux筆記
- 學習位運算
- js對檔案和二進位制操作的一些方法彙總JS
- 機器學習&深度學習 操作tips機器學習深度學習
- 關於學習的一些建議
- 關於深度學習的一些技巧深度學習
- 位操作
- 80%學生的困惑,學完C/C++之後學什麼?C++
- 給初學者一些學習Python的建議Python
- 推薦一些學習MySQL的資源MySql
- php轉go的一些學習歷程PHPGo
- 關於深度學習的一些淺見深度學習
- 入門教程的一些學習體會
- 爬蟲學習中的一些總結爬蟲
- 談談一些學習心得
- Hive學習之基本操作Hive
- MongoDB學習之聚合操作MongoDB
- 困惑度的計算
- 常用的JavaScript位操作(Bitwise)JavaScript
- 陶哲軒對數學學習的一些建議
- 位操作(取反)
- 一些冷門的js操作JS
- 關於table的一些操作
- KeyShot操作的一些補充
- C++ vector 的一些操作C++