The time for $isbit now beats the scripted mimic. Here's an updated scripted alias for $biton/$bitoff that's 28x faster at 512 bits, and 60x faster at 1024 bits. It just uses $isbit(N) to determine whether to add/subtract 2^(N-1). I didn't include logic to handle negative numbers, but should be similar for those.

Code
alias mapm_biton_bitoff {
  var %bits $int($1) , %t 1
  if (%bits !isnum 100-10000) var %bits 512 
  var %low.bf $calc(2^(%bits - 1)) , %hi.bf $calc(2^%bits) , %rand.bf $rands(%low.bf,%hi.bf)
  var %base2 $base(%rand.bf,10,2)
  echo -ag $count(%base2,1) of $len(%base2) bits are 1's. set $ $+ 2 = 1 to include crc checksum
  var %i %t , %ticks $ticksqpc , %check
  while (%i) {
    var %j %bits
    while (%j) {
      var %a.bf %rand.bf
      var %a.bf $biton(%a.bf,%j)
      if ($2) var %check $crc(%check %a.bf,0)
      dec %j
    }
    dec -s %i
  }
  echo -a style#1: biton time: $calc($ticksqpc - %ticks) %check
  var %i %t , %ticks $ticksqpc , %check
  while (%i) {
    var %j %bits , %a.bf %rand.bf
    while (%j) {
      var %a.bf %rand.bf
      if (!$isbit(%a.bf,%j)) var %a.bf %rand.bf + $calc(2^(%j -1))
      if ($2) var %check $crc(%check %a.bf,0)
      dec %j
    }
    dec -s %i
  }
  echo -a style#2 scripted-biton time: $calc($ticksqpc - %ticks) %check
  var %i %t , %ticks $ticksqpc , %check
  while (%i) {
    var %j %bits
    while (%j) {
      var %a.bf %rand.bf
      var %a.bf $bitoff(%a.bf,%j)
      if ($2) var %check $crc(%check %a.bf,0)
      dec %j
    }
    dec -s %i
  }
  echo -a style#1: bitoff time: $calc($ticksqpc - %ticks) %check
  var %i %t , %ticks $ticksqpc , %check
  while (%i) {
    var %j %bits , %a.bf %rand.bf
    while (%j) {
      var %a.bf %rand.bf
      if ($isbit(%a.bf,%j)) var %a.bf %a.bf - $calc(2^(%j -1))
      if ($2) var %check $crc(%check %a.bf,0)
      dec %j
    }
    dec -s %i
  }
  echo -a style#2 scripted-bitoff time: $calc($ticksqpc - %ticks) %check
}