[expr] bit-wise "and" operator, dual of [|] Arguments must be integers, result is an integer. Bit ''n'' of the result is 1 if bit ''n'' of each argument is 1. Otherwise, bit ''n'' of the result is 0. For negative arguments, we use the extended definition of [~] that '''[~]$a[==]-1-$a'''. There are then the following cases: %| Case | Result |% &| $a[>=]0,$b>=0 | Ordinary bitwise '''&''' |& &| $a>=0,$b[<]0 | `$a&$b == $a & ~(~$b)` ''Contrapositive law'' <
> `$a&$b == $a & ~ (-1-$b)` ''Extended definition of [~]'' <
> Since -1-$b is positive, $a & ~(-1-$b) can be evaluated in bitwise fashion. |& &| $a<0,$b>=0 | Commute to ($b & $a) and use the calculation above |& &| $a<0,$b<0 | `$a&$b == ~ (~$a <> ~$b)` ''De Morgan's Law'' <
> `$a&$b == ~ ((-1-$a) <> (-1-$b))` ''Extended definition of [~]'' <
> `$a&$b == -1-((-1-$a) <> (-1-$b))` ''Extended definition of [~]'' <
> Since [-]1-$a and -1-$b are both positive, the expression ((-1-$a) [<>] (-1-$b)) can be evaluated in the ordinary bitwise fashion. |& For logical/short-cut "and" use the [&&] operator. ---- [AMG]: Be wary of the precedence of this operator! Like [&&], it has lower precedence than the comparison operators. For more information on why, read the section "Neonatal C" found at [http://cm.bell-labs.com/cm/cs/who/dmr/chist.html]. %|Expression |Result|Comment |% &|expr 5&2==2 |1 |expression without parentheses|& &|expr 5&(2==2)|1 |actual behavior of Tcl and [C]|& &|expr (5&2)==2|0 |naively expected behavior |& ---- '''[jennylv] - 2012-08-07 16:15:14''' I want to convert signed integer to 32-bit hexadecimal. The following works fine for positive integer: ====== format %.8x $the_decimal_value ====== But for negative integer, I got 64-bit hexadecimal. For example 99 is converted to 00000063, but -81 is converted to ffffffffffffffaf. Anyone know how to get 32-bit hexadecimal fro negative integer? Thanks in advance! [AMG]: The %.8x means to pad to eight characters only if narrower than eight to begin with. You want to truncate the value. What you're looking for is the [&] operator. Try this: ====== % format %.8x [expr {$the_decimal_value & 0xffffffff}] ====== '''[jennylv] - 2012-08-07 16:28:19''' Thanks so much! That works fine:) <> Operator