Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.forth > #13545

Re: Counting bits using masks (riddle)

From mhx@iae.nl (Marcel Hendrix)
Subject Re: Counting bits using masks (riddle)
Newsgroups comp.lang.forth
Message-ID <87051699968435@frunobulax.edu> (permalink)
Date 2012-07-04 19:30 +0200
References <436a40a1-dac4-484d-bf4d-26464adae02d@s9g2000vbg.googlegroups.com>
Organization Wanadoo

Show all headers | View raw


Alex McDonald <blog@rivadpm.com> writes Re: Counting bits using masks (riddle)

> On Jul 4, 12:14 pm, Albert van der Horst <alb...@spenarnc.xs4all.nl> wrote:
>> In article <db44c136-f82d-435e-85ec-0ecdd25c6...@h10g2000yqn.googlegroups.com>,

> For Intel processors that don't have a POPCNT;

> 32bit version

> code cntbit     ( n -- bits-in-n )      \ population count of bits in eax
>     1 1 in/out
>                mov     ecx eax
...
>                next;

CREATE xbits	PRIVATE	#256 CHARS ALLOT  xbits #256 CONST-DATA

: #BITS	( u -- #bits )
	0 SWAP
	BEGIN	TUCK
	WHILE	1+ SWAP  DUP 1- AND
	REPEAT  NIP ;

: INIT-BITS	#256 0 DO  I #BITS  xbits I + C!  LOOP ; INIT-BITS   FORGET #BITS

64BIT? 
  [IF] -- Count bits in word
: #BITS	( u1 -- u2 )	
	         DUP $FF AND xbits + C@ >R
	8 RSHIFT DUP $FF AND xbits + C@ R> + >R
	8 RSHIFT DUP $FF AND xbits + C@ R> + >R
	8 RSHIFT DUP $FF AND xbits + C@ R> + >R
	8 RSHIFT DUP $FF AND xbits + C@ R> + >R
	8 RSHIFT DUP $FF AND xbits + C@ R> + >R
	8 RSHIFT DUP $FF AND xbits + C@ R> + SWAP
	8 RSHIFT     $FF AND xbits + C@ + ;
[ELSE]
: #BITS	( u1 -- u2 )	
	         DUP $FF AND xbits + C@ >R
	8 RSHIFT DUP $FF AND xbits + C@ R> + >R
	8 RSHIFT DUP $FF AND xbits + C@ R> + SWAP
	8 RSHIFT     $FF AND xbits + C@ + ;
[THEN]

: t1   ( u1 -- u2 ) #BITS ;
: t2   ( -- u )     12345 t1 ;
: test ( -- )       1234 t1 t2 + . ;

FORTH> see test
Flags: ANSI
$01248800  : test
$0124880A  push          #11 b#
$0124880C  jmp           .+10 ( $011398A2 ) offset NEAR
$01248811  ;

Saved a few ANDs there ...

-marcel

Back to comp.lang.forth | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Counting bits using masks (riddle) Albert van der Horst <albert@spenarnc.xs4all.nl> - 2012-07-03 21:27 +0000
  Re: Counting bits using masks (riddle) "A. K." <akk@nospam.org> - 2012-07-03 23:51 +0200
  Re: Counting bits using masks (riddle) Pablo Hugo Reda <pabloreda@gmail.com> - 2012-07-03 15:38 -0700
    Re: Counting bits using masks (riddle) Albert van der Horst <albert@spenarnc.xs4all.nl> - 2012-07-04 11:14 +0000
      Re: Counting bits using masks (riddle) Alex McDonald <blog@rivadpm.com> - 2012-07-04 04:26 -0700
        Re: Counting bits using masks (riddle) mhx@iae.nl (Marcel Hendrix) - 2012-07-04 19:30 +0200
          Re: Counting bits using masks (riddle) Alex McDonald <blog@rivadpm.com> - 2012-07-04 12:44 -0700
  Re: Counting bits using masks (riddle) Albert van der Horst <albert@spenarnc.xs4all.nl> - 2012-07-04 11:40 +0000
  Re: Counting bits using masks (riddle) Mark Wills <markrobertwills@yahoo.co.uk> - 2012-07-04 14:03 -0700

csiph-web