[Date Prev][Date Next][Thread Prev][Thread Next]
[Search]
[Date Index]
[Thread Index]
Re: [MacPerl] vec() & unpack() 5.0.6r1m
>On Fri, 23 Feb 1996, Paul Duda wrote:
>
>> PowerMac 7100/66 System 7.5.1
>> Macperl v5.0.6r1m
>>
>> Why does the following script only produce the expected results the first
>>time
>> the script is run?
>>
>> for ($i = 0;$i < 5;$i++) {
>> vec($vector, $i, 1) = 1;
>> print $i, '. Setbits are: ', unpack("%32b*", $vector), "\n";
>> }
>> print '$vector is: "', $vector, '" or ', unpack("b*", $vector), "\n";
::::::::::::::::::::::::::::::::
John Peterson's reply on the 24th Feb included the following suggestion:-
>One relatively easy way to fix this would be to declare bitcount as a static
>array with the values already defined, like this:
>
>static char bitcount[256] =
> { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
> 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
> 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
> 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
> 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
> 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
> 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
> 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
> 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
> 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
> 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
> 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
> 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
> 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
> 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
> 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 }
>
>...which I just created with the following PERL script (look familiar?):
>
>for $i (0..255) {
> $bitcount = 0;
> if ($i & 1) { $bitcount++ }
> if ($i & 2) { $bitcount++ }
> if ($i & 4) { $bitcount++ }
> if ($i & 8) { $bitcount++ }
> if ($i & 16) { $bitcount++ }
> if ($i & 32) { $bitcount++ }
> if ($i & 64) { $bitcount++ }
> if ($i & 128) { $bitcount++ }
>
> unless ($i % 16) { print "\n " }
> print "$bitcount, ";
>}
>
>Of course, Matthias would have to incorporate this (or a different fix) into
>his code for you.
::::::::::::::::::::::::::::::::::::::
In the meantime, using essentially the same algorithm, the following sub
routine could be used perhaps:
sub bit_count {
$bitcount = 0;
for ($i = 1; $i <=128; $i = $i*2) {
if ($i & @_[0]) { $bitcount++ }
}
return $bitcount;
}
For Paul Duda's original example <&bit_count(ord($vector))> always returns
5 as it should.
Alan
ajf@afco.demon.co.uk