2011-05-15 1 views
2

J'ajoute une série de 8196 entiers non signés 64 bits, et j'ai besoin que le total cumulé passe à zéro et continue à compter à partir de là ... tout comme un langage de programmation "normal" ferait à le plafond INT_MAX correspondant. Comme le montre le script de test, l'ajout de 1 à une valeur limite (FF, FFFF, etc.) ne cesse d'augmenter le total. Une fonctionnalité, sans doute, mais je voudrais limiter à 64 bits pour cette instance particulière ..Comment peut-on faire déborder l'addition hexadécimale en BC à la limite de 8 octets (uint64)?

Y at-il un moyen de limiter bc dans ce cas?

unset f 
for ((i=0; i<8; i++)); do 
    f=${f}FF; echo -ne "$((${#f}/2)) bytes + 1  " 
    echo 'ibase=16; obase=10; ('$f'+1)' |bc 
done 
echo "I want 8th+1 to = 0000000000000000" 

# output 
# 
# 1 bytes + 1  100 
# 2 bytes + 1  10000 
# 3 bytes + 1  1000000 
# 4 bytes + 1  100000000 
# 5 bytes + 1  10000000000 
# 6 bytes + 1  1000000000000 
# 7 bytes + 1  100000000000000 
# 8 bytes + 1  10000000000000000 
# I want 8th+1 to = 0000000000000000 

Répondre

1

Ceci est appelé un modulo et vous pouvez lire ici https://superuser.com/questions/31445/gnu-bc-modulo-with-scale-other-than-0 à propos modulo et bc.

+0

Ah .. merci ... Je me concentrais sur, et je m'attendais à ce que ce soit, un paramètre 'bc', comme 'BC_LINE_LENGTH = nnn' ou' scale' ou quelque chose de ce genre ... et je n'ai jamais vraiment pensé d'un modulo de cette façon ... ie. qu'elle tronque effectivement la fin de l'ordre élevé. Je n'y ai jamais pensé que comme le reste d'un quotient «toujours présent» ... D'accord, net ... donc j'ai juste besoin de faire un modulo après chaque ajout ... :) –

Questions connexes