On Aug 31, 2015, at 10:05 AM, Mike - st257 <silvertip257 at gmail.com> wrote: > > On Mon, Aug 31, 2015 at 11:15 AM, Warren Young <wyml at etr-usa.com> wrote: > >> ibase=A and obase=A > > Not sure how this helps me with my most recent example of bin_to_hex where > the ibase within the define clause wasn't honored. That’s because your bin_to_hex function is erroneously assuming that its input is just a string of digits that has no base interpretation, so that it can set ibase *after* bc has already seen the value, and that this will change the meaning of the prior input. That’s just plain wrong: the prior input has already been interpreted. You can’t wind back the clock like that. That sort of thinking only works in a string-based language like shell or Tcl, where a numeric string doesn’t take a meaning until you assign one. The correct form is: ibase=A /* needed only if ibase might not be 10 at this point */ obase=A /* ditto */ obase=16 /* means 16-base-10 here */ ibase=2 /* no possibility of confusion */ 10101011 Result: AB, as expected. The tricky bit is that you can’t swap the second pair of ibase and obase settings, since that would cause bc(1) to interpret obase=16 in base 2: bc(1) will clamp “16” to 11, which in base 2 is 3-base-10.