2012-11-21 11 views

Odpowiedz

6

Przynajmniej bash obsługuje liczb całkowitych szesnastkowych bezpośrednio, pod warunkiem, że są one prefiksem 0x:

$ [[ 0xdead -lt 0xcafe ]] && echo yes || echo no 
no 
$ [[ 0xdead -gt 0xcafe ]] && echo yes || echo no 
yes 

po prostu użyć operatorów porównania normalnie ...

+0

hej mam jeszcze jedną wątpliwość: jak sprawdzić, czy dane wejściowe to liczba lub ciąg znaków? – bd1257

0

Jak o

(("$answer" == 0x42)) 
echo $? 

answer=0xDEADCAFE 
(("$answer" == 0xDEADCAFE)) 
echo $? 
+0

co z a, b, c, d, e, f? – bd1257

+0

@ user1812956 Powinien działać dobrze – cnicutar

0

Właściwie odpowiedź @thkala działa tylko dla liczb nie większych niż 0x7fffffffffffffff (LLONG_MAX):

$ [[ 0xa000000000000000 -lt 0x6000000000000000 ]] && echo -1                                              
-1 
$ [[ 0xa00000000000000 -lt 0x600000000000000 ]] && echo -1 || echo 1 
1 

przypadku liczb większych następnie LLONG_MAX można użyć gdb, ale działa wolniej przedmiotu:

function cmp()                                
{                                   
    gdb -ex "p ${1}ULL == ${2}ULL ? 0 : (${1}ULL < ${2}ULL ? -1 : 1)" -batch |& grep '^$1' | cut -d' ' -f3                                          
} 

$ cmp 0xa000000000000000 0x6000000000000000 
1 
$ cmp 0xa00000000000000 0x600000000000000 
1 
+0

Właściwie odpowiedź @thkala działa tylko dla liczb nie większych niż 0x7fffffffffffffff (LLONG_MAX). Dla liczb większych niż LLONG_MAX możesz użyć gdb, ale oczywiście będzie działać wolniej. (zobacz, jak ładnie ta informacja, nie bezpośrednio w odpowiedzi na pytanie, pasuje do ** komentarza **.) (pozostało 300 znaków) –

Powiązane problemy