m b. for m e. 16+i.16 computes bitwise functions on (machine-word) integers, whence m b.&.(a.&i.) computes bitwise functions on characters.

Problem: suppose y is computed in one of two ways:

```y=: (c{a.) m b.&.(a.&i.) a.
y=: a.     m b.&.(a.&i.) c{a.```

where c is an integer between 0 and 255. Given y , compute integers c1 and m1 such that

`y -: (c1{a.) m1 b.&.(a.&i.) a.`

The problem can be solved as follows:

```f1=: 3 : 0 " 1
'i j'=. a.i.0 255{y
q=. _2 ]\ 0,j,  i,i,  i,255, i,(255-i), i,0,  255,j
p=. _2 ]\ j,17, i,19, i,23,  i,22,      i,18, j,27
p {~ q i. i,j
)

f2=: 3 : 0 " 1
assert. ((,256)-:\$y) *. 2=3!:0 y
'i j'=. a.i.0 255{y
if.     i=0     do. cm=. j,17
elseif. j=i     do. cm=. i,19
elseif. j=255   do. cm=. i,23
elseif. j=255-i do. cm=. i,22
elseif. j=0     do. cm=. i,18
elseif. i=255   do. cm=. j,27
elseif. 1       do. assert. 0 [ 'y is not generated by m b.' end.
assert. y -: (c{a.) m b.&.(a.&i.) a. [ 'c m'=. cm
)```

f1 and f2 are equivalent; f2 is less concise than f1 but incorporates checks and is more readily translated into a lower-level language. If y is not a result of m b. , then an error is signalled.

Examples:

```   ] 'c m'=: 0 16+?256 16
110 19
y=: (c{a.) m b.&.(a.&i.) a.
f2 y
110 19
y -: (110{a.) 19 b.&.(a.&i.) a.
1

] 'c m'=: 0 16+?256 16
54 25
y=: a. m b.&.(a.&i.) c{a.
f2 y
201 22
y -: (201{a.) 22 b.&.(a.&i.) a.
1

f1 a.{~ ?~ 256
|index error: f1
|   p    {~q i.i,j

f2 a.{~ ?~ 256
|assertion failure: f2
|   0['y is not generated by m b.'```

Test all possibilities:

```   ya=: (16+i.16) 4 : 'y  x b.&.(a.&i.) a.'"0/ a.
ay=: (16+i.16) 4 : 'a. x b.&.(a.&i.) y '"0/ a.

\$ ya
16 256 256
\$ ay
16 256 256

1 [ f2 ya
1
1 [ f2 ay
1

(f1 -: f2) ya
1
(f1 -: f2) ay
1```

The choice of 0 255 as the y entries to use in the decision process is not unique. In fact, as the following expressions demonstrate, any pair i,255-i would do.

```   t=: ya ,&(,/) ay    NB. all possibilities
\$ t
8192 256
# ~. t              NB. # of all unique possibilities
1528
# ~. 0 255{"1 t     NB. 0 255 capture them all
1528

j=: (,.|.) i.256    NB. all pairs i,255-i

*./ 1528 = j #@~.@({"1"_)"1 _ t
1```

Contributed by RogerHui. An earlier version of the text appeared in the J Forum on 2007-10-22.

Essays/Bitwise Functions on Characters (last edited 2008-12-08 10:45:48 by anonymous)