絕對值相關

2021-06-06 00:03:49 字數 712 閱讀 2659

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.輸入描述 有多組測...