Важный нюанс: то, что возвращают bin(), oct() и hex(), – это str, а не число. Python явно об этом сигнализирует префиксом: 0b перед двоичной записью, 0o перед восьмеричной, 0x перед шестнадцатеричной.
Префикс – не украшение, а необходимость: без него, глядя на голую строку цифр, невозможно понять, в какой она системе – «10» это два, восемь или шестнадцать? Префикс играет ту же роль, что нижний индекс в записи $101_2$ на бумаге.
А раз результат – строка, то + для двух таких результатов сработает не как сложение, а как склейка:
print(bin(5) + bin(3)) # 0b1010b11 – склеились две строки!
print(bin(5 + 3)) # 0b1000 – а вот это сумма
Ещё одна деталь: буквы в результате hex() – строчные (0xd6), хотя на бумаге для тех же букв обычно используют заглавное написание (D6). Это просто соглашение Python, на само число оно не влияет.