Seite 2 von 2

Re: Ein einziges Bit zählen

Verfasst: 12.05.2015 11:06
von 7x7
Wow...immer wieder fantastisch, welche interessanten Lösungen kollektives Denken hervorbringt! Eure Vorschläge haben mir sehr weitergeholfen! :allright:

Apropos "kollektives Denken": In meiner Teenager-Zeit habe ich die "Perry Rhodan"-Geschichten (gibt es die überhaupt noch?) geradezu verschlungen. Da gab es ein Kollektiv-Wesen Namens "ES"...aber das würde jetzt hier zu weit führen! :mrgreen:

Re: Ein einziges Bit zählen

Verfasst: 14.05.2015 10:39
von mk-soft
Hab ich irgendwo aus dem Internet übersetzt.

Nur 32bit. Wie das mit 64bit geht weis ich noch nicht.

Code: Alles auswählen

Procedure countBits(x)

  ; x = x - ((x >> 1) & 0x55555555)
  !mov eax, [p.v_x]
  !mov ecx, eax
  !shr ecx, 1
  !And ecx, 55555555h
  !sub eax, ecx
  ; x = (x & 0x33333333) + ((x >> 2) & 0x33333333)
  !mov ecx, eax
  !And eax, 33333333h
  !shr ecx, 2
  !And ecx, 33333333h
  !add ecx, eax
  ; x = x + (x >> 4)
  !mov eax, ecx
  !shr eax, 4
  !add eax, ecx
  ; x &= 0xF0F0F0F
  !And eax, 0F0F0F0Fh
  ; (x * 0x01010101) >> 24
  !imul eax, 01010101h
  !shr eax, 24
  ProcedureReturn
  
EndProcedure

a = $80000001
Debug countBits(a)
P.S.
Hier noch mal mit SSE4 popcnt

Code: Alles auswählen

Procedure countBits(x)
  
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
    !popcnt eax, [p.v_x]
  CompilerElse
    !popcnt rax, [p.v_x]
  CompilerEndIf
  
  ProcedureReturn
  
EndProcedure

a = $80000001
b = countBits(a)
Debug b

Re: Ein einziges Bit zählen

Verfasst: 23.05.2015 22:36
von Sebastian
Perry Rhodan wurde gerade wieder neu groß aufgelegt. Hat seinen "zweiten Frühling" durch die eReader erleben dürfen. Gab einen Stand auf der Leipziger Buchmesse. Ist mir dort ins Auge gestochen :)