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 [L1 ].
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:)