Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 586b2e3

Browse files
committed
long_format: Simplify the overly elaborate base-is-a-power-of-2 code.
1 parent 881fd90 commit 586b2e3

1 file changed

Lines changed: 16 additions & 28 deletions

File tree

Objects/longobject.c

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -792,38 +792,26 @@ long_format(PyObject *aa, int base, int addL)
792792
}
793793
else if ((base & (base - 1)) == 0) {
794794
/* JRH: special case for power-of-2 bases */
795-
twodigits temp = a->ob_digit[0];
796-
int bitsleft = SHIFT;
797-
int rem;
798-
int last = size_a;
799-
int basebits = 1;
795+
twodigits accum = 0;
796+
int accumbits = 0; /* # of bits in accum */
797+
int basebits = 1; /* # of bits in base-1 */
800798
i = base;
801799
while ((i >>= 1) > 1)
802800
++basebits;
803-
804-
i = 0;
805-
for (;;) {
806-
while (bitsleft >= basebits) {
807-
if ((temp == 0) && (i >= last - 1)) break;
808-
rem = temp & (base - 1);
809-
if (rem < 10)
810-
rem += '0';
811-
else
812-
rem += 'A' - 10;
801+
802+
for (i = 0; i < size_a; ++i) {
803+
accum |= a->ob_digit[i] << accumbits;
804+
accumbits += SHIFT;
805+
assert(accumbits >= basebits);
806+
do {
807+
char digit = (char)(accum & (base - 1));
808+
digit += (digit < 10) ? '0' : 'A'-10;
813809
assert(p > PyString_AS_STRING(str));
814-
*--p = (char) rem;
815-
bitsleft -= basebits;
816-
temp >>= basebits;
817-
}
818-
if (++i >= last) {
819-
if (temp == 0) break;
820-
bitsleft = 99;
821-
/* loop again to pick up final digits */
822-
}
823-
else {
824-
temp = (a->ob_digit[i] << bitsleft) | temp;
825-
bitsleft += SHIFT;
826-
}
810+
*--p = digit;
811+
accumbits -= basebits;
812+
accum >>= basebits;
813+
} while (i < size_a-1 ? accumbits >= basebits :
814+
accum > 0);
827815
}
828816
}
829817
else {

0 commit comments

Comments
 (0)