Moi,
 
Yes SET is great and it is easy to go from SET to INTEGER. Things are much uglier in C. However C has an 4 byte unsigned integer and you can manipulate this as bits using <<, >>, ^ etc. This is very useful for writing random number generators where you can write

unsigned long y;

static int k = 0;

static unsigned long x[N]={ /* initial 25 seeds, change as you wish */

0x95f24dab, 0x0b685215, 0xe76ccae7, 0xaf3ec239, 0x715fad23,

0x24a590ad, 0x69e4b5ef, 0xbf456141, 0x96bc1b7b, 0xa7bdf825,

0xc1de75b7, 0x8858a9c9, 0x2da87693, 0xb657f9dd, 0xffdc8a9f,

0x8121da71, 0x8b823ecb, 0x885d05f5, 0x4e20cd47, 0x5a9ad5d9,

0x512c0c03, 0xea857ccd, 0x4cc1d30f, 0x8891a8a1, 0xa6b7aadb

};

x[kk] = x[kk+M] ^ (x[kk] >> 1) ^ mag01[x[kk] % 2];

and

y = x[k];

y ^= (y << 7) & 0x2b5b2500; /* s and b, magic vectors */

y ^= (y << 15) & 0xdb8b0000; /* t and c, magic vectors */

and

return( (double) y / (unsigned long) 0xffffffff);

The problem I have with the C code is x[kk] % 2 and the return statement. What is the best thing to do in CP?

Regards

    Andrew

----- Original Message ----- 
From: "Wojtek Skulski" <skulski@pas.rochester.edu>
To: "BlackBox Mailing List" <blackbox@oberon.ch>
Sent: Monday, March 21, 2005 5:13 PM
Subject: [BlackBox] - Bit operations in Component Pascal

> Hi:
> 
>   one of the most useful features of Component Pascal,
> and perhaps least appreciated, are the bit manipulation
> intrinsics of the CP language. Today I showed the following
> program to one of my collegaues who was wondering how to
> manipulate bits. I am posting this program as a possible
> addition to the CP documentation being discussed on this list.
> 
> It is wonderful to go back and forth between bitsets and integers
> and be able to manipulate bits directly without any obscurations.
> 
> MODULE TstSetExample;
> IMPORT StdLog;
> 
> PROCEDURE Do *;
>   VAR s   : SET;
>       i   : INTEGER;
>       ans : BOOLEAN;
> BEGIN
>   StdLog.String (" Example set operations ");
>   StdLog.Ln;
>   s := {0,1..3,15};
>   StdLog.Set (s); StdLog.Ln;
>   s := s + {7};
>   StdLog.Set (s); StdLog.Ln;
>   EXCL (s, 15);
>   StdLog.Set (s); StdLog.Ln;
>   s := BITS (22);
>   i := ORD (s);
>   StdLog.Int (i); StdLog.Ln;
>   StdLog.Set (s); StdLog.Ln;
> 
>   FOR i := 0 TO MAX (SET)  DO
>      StdLog.Int (i); StdLog.String (" ");
>      ans := i IN s;
>      StdLog.Bool (ans);
>      StdLog.Ln;
>   END;
> END Do;
> 
> END TstSetExample.
> 
> <CTRL-Q> TstSetExample.Do
> 
> --- BlackBox
> --- send subject HELP or UNSUBSCRIBE to blackbox@oberon.ch
> 
>