16

Unfortunately bc and calc don't support xor.

21

With any POSIX shell:

$ printf '%#x\n' "$((0x11 ^ 0x22))"
0x33
  • %#x works in C too, nice! – Steven Penny Jun 27 '16 at 22:54
35

Like this:

echo $(( 0xA ^ 0xF ))

Or if you want the answer in hex:

printf '0x%X\n' $(( 0xA ^ 0xF ))

On a side note, calc(1) does support xor as a function:

$ calc
base(16)
    0xa
xor(0x22, 0x33)
    0x11
12

gdb has powerful expression calculator:

gdb -q -ex 'print/x 0xA ^ 0xF' -ex q

A shell function:

calc_gdb() { gdb -q -ex "print/x $*" -ex q;}
calc_gdb 0xA ^ 0xF

$1 = 0x5
  • 4
    Amusing, but it seems like a sledgehammer to crack a nut! – abligh Jun 28 '16 at 8:16
  • 1
    Useful for the more general case of evaluating expressions, but not for XOR – Peter Cordes Jun 28 '16 at 8:57
5

It is possible to do that in bc:

echo 'xor(10,15)' | bc -l logic.bc

Or in hex:

echo 'obase=16;ibase=16; xor(AA,FF)' | bc -l logic.bc

Using the logic file from here.

Just do wget http://phodd.net/gnu-bc/code/logic.bc to get it.

  • Wow, that site is the bc(1) geek's heaven. :) Thank you for the link. – Satō Katsura Jun 28 '16 at 17:24
  • My version of "bc" doesn't seem to have the XOR function and just says: Runtime error (func=(main), adr=51): Function xor not defined. – slacy Oct 5 '16 at 21:13
  • @slacy did you get the logic.bc file referenced there? That is what defines xor it seems – Eric Renouf Oct 11 '16 at 17:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.