abs()是如何來求絕對值的並且看看它的效率如何,所以反彙編出來看了下:
sar $0x1f,%edx
xor %edx,%eax
sub %edx,%eax
對應c語言:
//求int a的絕對值
b = a >> 31;
a = a ^ b;
a = a - b;
起初還沒想透為什麼這樣就能得到絕對值,再細想,對右移理解有誤(微機原理忘光了,汗顏)。
要理解上述程式需要了解:
移位分為算術移位與邏輯移位,
算術左移sal:低位補0(不保持高位)
算術右移sar:最高位的符號位在右移的同時,且保持
邏輯左移shl:低位補0(不保持高位)
邏輯右移shr:高位補0
邏輯移位用於無符號數的移位,算術移位用於有符號數的移位。
現在再來看我們的**:
//求int a的絕對值
b = a >> 31; //如果a為負,則b = 0xffffffff, a為正,則b = 0x00;
a = a ^ b; //如果b = 0xffffffff(a為負)則表示a取反,如果b = 0x00 (a為正)則表示a不變
a = a - b; //如果a為負,a-b即為a + 1,如果a為正則 a - b即為 a - 0
綜上所述,上面的**所做的就是a為正數,則不變,a為負數,則取反加1。
絕對值排序
輸入n n 100 個整數,按照絕對值從大到小排序後輸出。題目保證對於每乙個測試例項,所有的數的絕對值都不相等。輸入資料有多組,每組佔一行,每行的第乙個數字為n,接著是n個整數,n 0表示輸入資料的結束,不做處理。對於每個測試例項,輸出排序後的結果,兩個數之間用乙個空格隔開。每個測試例項佔一行。3 ...
絕對值排序
problem description 輸入n n 100 個整數,按照絕對值從大到小排序後輸出。題目保證對於每乙個測試例項,所有的數的絕對值都不相等。input 輸入資料有多組,每組佔一行,每行的第乙個數字為n,接著是n個整數,n 0表示輸入資料的結束,不做處理。output 對於每個測試例項,輸...
絕對值最大
題目詳情 給你乙個陣列a n 請你計算出ans max a i a j 0 i,j 例如 a 則 a 0 a 0 1 1 2.a 0 a 1 1 4 5.a 0 a 2 1 3 2.a 1 a 1 4 4 8.a 1 a 2 4 3 1.a 2 a 2 3 3 6.所以ans 8.輸入描述 有多組測...