proc binfmt1 {k {cnt 8}} { if {![string is integer $k]} {error "argument is not an integer"} #Compute minimum number of bits necessary #This is the integer ceiling of the log of the number to the base 2. if {$k == 0} {set bits 1} else {set bits [expr int(ceil((log(abs($k)))/(log(2))))]} if {$bits > $cnt} {set cnt $bits} #Now compute binary representation for {set i [expr $cnt -1]} {$i > -1} {incr i -1} { append s [expr ($k >> $i) & 1] } return $s } proc demo {} { puts "binfmt 3 = [binfmt 3]" puts "binfmt -3 = [binfmt -3]" puts "binfmt 3 0 = [binfmt 3 0]" puts "binfmt 3 4 = [binfmt 3 4]" puts "binfmt 25 = [binfmt 25]" puts "binfmt 1025 = [binfmt 1025]" puts "binfmt 69125 = [binfmt 69125]" puts "binfmt 69125 24 = [binfmt 69125 24]" } demoHere is the output of the demo script, right-justified for expository purposes:
binfmt 3 = 00000011 binfmt -3 = 11111101 binfmt 3 0 = 11 binfmt 3 4 = 0011 binfmt 25 = 00011001 binfmt 1025 = 10000000001 binfmt 69125 = 10000111000000101 binfmt 69125 24 = 000000010000111000000101
Omar Medina 11-08-2006 Another Variant:
#-------------------------- proc pToBinaryStr {vValue} { set vBinStr "" foreach vVal [split [format %lX $vValue] {}] { switch $vVal { 0 {append vBinStr "0000"} 1 {append vBinStr "0001"} 2 {append vBinStr "0010"} 3 {append vBinStr "0011"} 4 {append vBinStr "0100"} 5 {append vBinStr "0101"} 6 {append vBinStr "0110"} 7 {append vBinStr "0111"} 8 {append vBinStr "1000"} 9 {append vBinStr "1001"} a - A {append vBinStr "1010"} b - B {append vBinStr "1011"} c - C {append vBinStr "1100"} d - D {append vBinStr "1101"} e - E {append vBinStr "1110"} f - F {append vBinStr "1111"} } } return $vBinStr } #--------------------------Output:
#-------------------------- pToBinaryStr 45 00101101 pToBinaryStr 4 0100 pToBinaryStr 7777 0001111001100001 pToBinaryStr 0x334 001100110100 #--------------------------
RS 2006-08-11: Note that the "mysterious reason" mostly is historic: format just wraps C's sprintf() function. Besides that, Tcl, has binary scan and binary format:
% binary scan [binary format I 3] B* bits; set bits 00000000000000000000000000000011 % binary scan [binary format I -3] B* bits; set bits 11111111111111111111111111111101So it's just the intended length of the bitstring that you'll have to manipulate, if you so wish :^)RS 2006-10-04: Hex string of arbitrary length to bits:
interp alias {} hex2bin {} string map -nocase { 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 a 1010 b 1011 c 1100 d 1101 e 1110 f 1111 }ferrieux 8.6 has %b, %lb, %llb in format.