from __future__ import print_function import sys def calculate_one (ov, nv): old_start = int(ov[18:26], 16) old_end = int(ov[26:34], 16) new_start = int(nv[18:26], 16) new_end = int(nv[26:34], 16) if (new_end < old_start) or (new_start > old_end): #print '%s, %s -> ZERO' % (ov, nv) return 0 all_start = max(old_start, new_start) all_end = min(old_end, new_end) #print '%s, %s -> %08x' % (ov, nv, all_end - all_start + 1) return all_end - all_start + 1 def calculate_all (values): total = 0 nv_index = len(values) // 2 for old_val in values[:nv_index]: new_val = values[nv_index] nv_index += 1 total += calculate_one(old_val, new_val) return total """ test1_vals = [ '0x0000000000000000000000003fffffff', # first quarter '0x0000000000000000400000007fffffff', # second quarter '0x000000000000000080000000ffffffff', # second half '0x00000000000000000000000055555554', # first third '0x000000000000000055555555aaaaaaa9', # second third '0x0000000000000000aaaaaaaaffffffff', # last third ] test2_vals = [ '0x0000000000000000000000003fffffff', # first quarter '0x0000000000000000400000007fffffff', # second quarter '0x000000000000000080000000ffffffff', # second half '0x00000000000000000000000055555554', # first third # Next two are (incorrectly) swapped. '0x0000000000000000aaaaaaaaffffffff', # last third '0x000000000000000055555555aaaaaaa9', # second third ] print '%08x' % calculate_one(test1_vals[0], test1_vals[3]) print '%08x' % calculate_one(test1_vals[1], test1_vals[4]) print '%08x' % calculate_one(test1_vals[2], test1_vals[5]) print '= %08x' % calculate_all(test1_vals) print '%08x' % calculate_one(test2_vals[0], test2_vals[3]) print '%08x' % calculate_one(test2_vals[1], test2_vals[4]) print '%08x' % calculate_one(test2_vals[2], test2_vals[5]) print '= %08x' % calculate_all(test2_vals) """ if __name__ == '__main__': # Return decimal so bash can reason about it. print('%d' % calculate_all(sys.argv[1:]))