рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдЕрдЬреАрдм рдкреЙрдкрдХреЙрдЗрди рдЕрдиреБрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдпрд╣ рдореЗрд░реА рдкреНрд░рд╕реНрддреБрддрд┐ рдХрд╛ рдЫрджреНрдо рдбрд┐рдХреЛрдбрд┐рдВрдЧ рд╣реИ !! Con 2019

рдЖрдЬ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдкрд╛рд╕ popcount рдирд╛рдордХ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ, рдЬреЛ 'рдЬрдирд╕рдВрдЦреНрдпрд╛ рдЧрдгрдирд╛' рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ рд╣реИред рд╡рд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рддреА рд╣реИ: рдорд╢реАрди рд╢рдмреНрдж рдореЗрдВ рд╕реЗрдЯ рдмрд┐рдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЧрд┐рдирд╛рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (рдЖрдЗрдП рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП 8-рдмрд┐рдЯ рд╢рдмреНрдж рд▓реЗрдВ), popcount(00100110) 3 рд╣реИ, рдФрд░ popcount(01100000) 2 рд╣реИред

рдпрд╣ рдЖрдкрдХреЛ рдореЗрд░реА рддрд░рд╣ рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рд╡рд╣ рдХрд░рддрд╛ рд╣реИ! рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, рд╣реИ рдирд╛?

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рдХреБрдЫ рд╣рд╛рдЗрдкрд░рд╕реНрдкреЗрд╢рд┐рдЕрд▓рд╛рдЗрдЬреНрдб рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 1961 рдХреЗ рдмрд╛рдж рд╕реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ:


рддреЛ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ?

рдПрдирдПрд╕рдП рдирд┐рд░реНрджреЗрд╢


popcount "NSA рдирд┐рд░реНрджреЗрд╢" рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ comp.arch рдкрд░ рдПрдХ рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рд╕реВрддреНрд░ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдореЗрдВ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред рдЕрдлрд╡рд╛рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдирдПрд╕рдП рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рд╕реАрдкреАрдпреВ рдЕрдиреБрджреЗрд╢ рд╕реЗрдЯ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рд╕рдВрдЧреНрд░рд╣реАрдд рдореЗрд▓ рдереНрд░реЗрдб рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рдпрд╣ рдПрдХ рддреЗрдЬрд╝ рдЯреНрд░рдХ рд╕реАрдбреАрд╕реА рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ "рдЕрдЪреНрдЫреЗ рдЧреНрд░рд╛рд╣рдХ" рдореЗрдВ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдПрдХ рдкрд░рдВрдкрд░рд╛ рдереА - рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдЯреНрд░рдХ рдХрд╛ рдЖрдЧрдорди рд╣реБрдЖ рдФрд░ рдлрд┐рд░ рдХрднреА рдирд╣реАрдВ рд╕реБрдирд╛ рдЧрдпрд╛ред

рдПрдХ рдорд╣рд╛рди рдХрд┐рдВрд╡рджрдВрддреА, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛?

рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдПрдХ рдорд╛рдк рд╣реИрдорд┐рдВрдЧ рдХрд╛ рд╡рдЬрди рд╣реИ , рдЬреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдЧреИрд░-рд╢реВрдиреНрдп рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдПрдХ рдмрд╛рдЗрдирд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдпрд╣ popcount !

рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ , рдПрдирдПрд╕рдП рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯреЗрдб рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдХреНрд░рд┐рдкреНрдЯреЛрдХрд░реЗрдВрд╕реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдФрд░ рдЪреВрдВрдХрд┐ рд╕реАрдбреАрд╕реА 6000 рдиреЗ 60-рдмрд┐рдЯ рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╢рдмреНрдж рдЙрди рд╕рднреА рд╡рд░реНрдгрдорд╛рд▓рд╛рдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдерд╛ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рдереЗред рд╡реЗ рд╕рдХреНрд╖рдо рдереЗ:

  1. рд╕рдВрджреЗрд╢ рдХреЛ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ
  2. рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╡рд░реНрдг рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕реЗрдЯ рдХрд░реЗрдВ
  3. рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП popcount рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
  4. рдЖрдЧреЗ рдХреНрд░рд┐рдкреНрдЯреИрдирд╛рд▓рд┐рд╕рд┐рд╕ рдХреЗ рд▓рд┐рдП рд╣реИрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ, popcount 1970 рдХреЗ рджрд╢рдХ рдФрд░ 2000 рдХреЗ рдордзреНрдп рдХреЗ рдмреАрдЪ рдХреЗ рдирд┐рд░реНрджреЗрд╢ рд╕реЗрдЯ рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд░рд┐рдЯрд░реНрди рдХреЛ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдФрд░ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рд▓рд┐рдП рдФрд░ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдмрдЧ рдареАрдХ рдХрд░рдирд╛


рд╣реИрдорд┐рдВрдЧ рд╡рдЬрди рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИрдорд┐рдВрдЧ рджреВрд░реА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЬреЛ рдПрдХ рд╣реА рд▓рдВрдмрд╛рдИ рдХреА рджреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмреАрдЪ рд╡рд┐рднрд┐рдиреНрди рдкрджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рджреЛ рдмрд╛рдЗрдирд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ x рдФрд░ y , рдпрд╣ XOR рдХреЗ рдмрд╛рдж рд╕рд┐рд░реНрдл popcount ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

  00100110
 01100000 ^
 --------
 01000110

 рдкреЙрдкрдХрд╛рдЙрдВрдЯ (01000110) = 3 

рджреВрд░рд╕рдВрдЪрд╛рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рдпрд╣ рд╕рдВрдХреЗрдд рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдПрдХ рдЬреНрдЮрд╛рдд рд╢рдмреНрдж рддрд╛рд░ рдХреЗ рд╕рд╛рде рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рддреНрд░реБрдЯрд┐ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдмрд┐рдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рддрдм рд╣рдо рдЙрдкрдпреБрдХреНрдд рддреНрд░реБрдЯрд┐ рд╕реБрдзрд╛рд░ рдХреЛрдб рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдПрдХ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЛ рджреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдмрд┐рдЯреНрд╕ рддрдХ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рддреЛ рдХреЛрдб рд╢рдмреНрдж рдХрдо рд╕реЗ рдХрдо 5 рд╣реИрдорд┐рдВрдЧ рджреВрд░реА рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдмрд╛рдЗрдирд░реА рдХрдирд╡рд▓реНрд╢рдирд▓ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ


рдФрд░ рдЕрдм рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИ: рджреНрд╡рд┐рдЖрдзрд╛рд░реА рджреГрдврд╝ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ! рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдпрд╣ рдХреНрдпрд╛ рд╣реИ?

  • рдмрд╛рдЗрдирд░реА рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ 32-рдмрд┐рдЯ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рд╡реИрд▓реНрдпреВ рдХреЗ рд╡рд┐рдкрд░реАрдд, +1 рдХреЗ рдорд╛рдиреЛрдВ (1 рдХреЗ рд░реВрдк рдореЗрдВ рдПрдиреНрдХреЛрдбреЗрдб) рдФрд░ -1 (рдПрдиреНрдХреЛрдбреЗрдб 0 рдХреЗ рд░реВрдк рдореЗрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
  • рдХреНрдпрд╛ рдХрдирд╡рд▓реНрд╢рди рдХрд╛ рдорддрд▓рдм рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрд╛ рд╣реИ?
  • рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдЬрд╛рдирд╡рд░реЛрдВ рдХреЗ рджрд┐рдорд╛рдЧ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реА рд╣реИрдВ (рдпрд╣рд╛рдВ рдореИрдВ рдереЛрдбрд╝рд╛ рддреИрд░ рд░рд╣рд╛ рд╣реВрдВ)ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ рдмрд╛рдЗрдирд░реА рдореИрдЯреНрд░рд┐рд╕ рдХрд╛ рдЧреБрдгрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдмрд╛рдЗрдирд░реА рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЦрд╛рд╕ рд╣реИ?

32-рдмрд┐рдЯ рдореВрд▓реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрд╛ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕реАрдкреАрдпреВ рдФрд░ рдЬреАрдкреАрдпреВ рдХреЗ рд╕рд╛рде рдбреЗрд╕реНрдХрдЯреЙрдк рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╣рдо рдЫреЛрдЯреЗ рдФрд░ рд╕рд░рд▓ рдЙрдкрдХрд░рдгреЛрдВ рдЬреИрд╕реЗ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди, рд░рд╛рдЙрдЯрд░, рд╕реНрдорд╛рд░реНрдЯ рдШрдбрд╝рд┐рдпреЛрдВ рдЖрджрд┐ рдкрд░ рдЙрдкрдпреЛрдЧреА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рдо рдЗрдирдХрд╛ рд╡рд┐рдШрдЯрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╛рдЗрдирд░реА рдореИрдЯреНрд░рд┐рд╕ рдХреА рдкрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдореИрдЯреНрд░реАрд╕, рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рд╣рдо рдкрд░рддреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рдмрд╛рд╡рдЬреВрдж рднреА рд▓рд╛рдн рдЙрдард╛рддреЗ рд╣реИрдВред

рдпрд╣ рд╡рд╣ popcount рд╣реИ popcount рдЦреЗрд▓рдиреЗ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЛ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  a = xnor (x, y)
 рдмреА = рдкреЙрдкрдХрд╛рдЙрдВрдЯ (рдП)
 рд╕реА = рд▓реЗрди (рдП)
 рдбреЙрдЯ (x, y) = 2 ├Ч b - c 

рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдФрд░ рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВред

рд╢рддрд░рдВрдЬ рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ


рдХрдИ рд╢рддрд░рдВрдЬ рдХрд╛рд░реНрдпрдХреНрд░рдо рдПрдХ рдмрд┐рдЯрдмреЛрд░реНрдб рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрд╕рд╛рдиреА рд╕реЗ 64-рдмрд┐рдЯ рд╢рдмреНрдж рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред Population Count рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рд╕рд╛рд░реНрдердХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреИрд╕реЗ рдХрд┐рд╕реА рдЖрдВрдХрдбрд╝реЗ рдХреА рдЧрддрд┐рд╢реАрд▓рддрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ред

рдЙрдБрдЧрд▓рд┐рдпреЛрдВ рдХрд╛ рдлрдбрд╝рдХрдирд╛


рдпрд╣ popcount рджреВрд░реА рд╕реЗ рднреА рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ: рдЕрдгреБ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рд╣реИрд╢ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рддреБрд▓рдирд╛ ( popcount рдХрд╛ рдЙрдкрдпреЛрдЧ popcount ) рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡реЗ рд╕рдорд╛рди рдХреИрд╕реЗ рд╣реИрдВред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВред

рд╣реИрд╢ рдРрд░реЗ рдореИрдкреНрдб рдЯреНрд░рд╛рдЗ (HAMT)


рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ popcount рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛! рдПрдЪрдПрдПрдордЯреА рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ ( рдкрд╣рд▓реА рдмрд╛рд░ рдлрд┐рд▓ рдмреИрдЧрд╡реЗрд▓ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ ) рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдЯреНрд░рд╛рдЗ рдиреЛрдб рдкрд░ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдмрд╣реБрдд рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдорд╛рди (рдЖрдорддреМрд░ рдкрд░ 32 рдпрд╛ 64) рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, 32 рдпрд╛ 64 рддрддреНрд╡ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рд╣рд░ рдмрд╛рд░ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдмреЗрдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рд╕рд░рдгреА рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВред рд╕рдорд╛рдзрд╛рди рдПрдХ рдмрд┐рдЯрдорд╛рд╕реНрдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗрдЯ рдмрд┐рдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕рд░рдгреА рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ, рдЬреЛ рд╕рд░рдгреА рдХреЛ рдмрдврд╝рдиреЗ рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдЕрдиреБрдмрдВрдз рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХрд╛рдВрдХ рдЧрдгрдирд╛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ popcount рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред HAMT рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реЗ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ , рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рд╕рдВрдХреБрдЪрд┐рдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдБ


рдпрд╣ рдЕрдиреБрд╕рдВрдзрд╛рди рдХрд╛ рдПрдХ рд░реЛрдорд╛рдВрдЪрдХ рдирдпрд╛ рдХреНрд╖реЗрддреНрд░ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧреА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рдирд╛ рдЕрдирдкреИрдХ рдХрд┐рдП рдХрдо рд╕реЗ рдХрдо рдЬрдЧрд╣ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмрд┐рдЯреНрд╕ (рдмрд┐рдЯ рд╡реИрдХреНрдЯрд░) рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╣реИ рдЬреЛ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  • rank(i) рдмрд┐рдЯ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ i-th рдЗрдВрдбреЗрдХреНрд╕ рддрдХ рджрд┐рдП рдЧрдП рдмрд┐рдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЧрд┐рдирддрд╛ рд╣реИ
  • select(i) рдЙрд╕ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдЦреЛрдЬрддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ i-th рдмрд┐рдЯ рд╕реЗрдЯ рд╣реИ

рдмрдбрд╝реА рдмрд┐рдЯ рд╡реИрдХреНрдЯрд░ рдкрд░ рдЗрди рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рдХреБрд╢рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдиреЗ рдФрд░ popcount рдЬреБрдбрд╝реЗ рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА popcount ред рдпрд╣рд╛рдВ RRR рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЕрдЪреНрдЫрд╛ рдЕрд╡рд▓реЛрдХрди рд╣реИред рдФрд░, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рд╕рдмрд╕реЗ рдЙрдиреНрдирдд рдЖрдзреБрдирд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╡рд░реНрдгрди рдЕрдВрддрд░рд┐рдХреНрд╖-рдХреБрд╢рд▓, рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рд░реИрдВрдХ рдФрд░ рдЕрд╕рдореНрдмрджреНрдз рдмрд┐рдЯ рдЕрдиреБрдХреНрд░рдореЛрдВ рдкрд░ рдЪрдпрдирд┐рдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

рд╕рдВрдХрд▓рдХ рдЕрдиреБрдХреВрд▓рди


popcount рдЗрддрдирд╛ рд╡реНрдпрд╛рдкрдХ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдХрд┐ GCC рдФрд░ popcount рджреЛрдиреЛрдВ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдХреНрд▓реИрдкреА рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ: "рдУрд╣, рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк popcount рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдореБрдЭреЗ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рджреЛ рдФрд░ рдЗрд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд░ popcount !" рдЗрд╕реА LLVM рдХреЛрдб рдпрд╣рд╛рдБ рд╣реИ ред рдбреИрдирд┐рдпрд▓ рд▓реЗрдорд╛рдпрд░ рдЗрд╕реЗ рдЖрдзреБрдирд┐рдХ рд╕рдВрдХрд▓рдХ рдХреЗ рдЕрджреНрднреБрдд рджрд┐рдорд╛рдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрджреНрдзреГрдд рдХрд░рддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЕрдкрдиреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд░рд╣рд╕реНрдп рдореЗрдВ рдбреВрдмрд╛ рд╣реБрдЖ, popcount рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рд░ рдЬрдЧрд╣ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ popcount , рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╕реАрдкреАрдпреВ рдирд┐рд░реНрджреЗрд╢ рд░рд╣рд╛ред рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдпрд╣ рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬреНрдЮрд╛рди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдРрд╕реЗ рдЕрдиреНрдп рдЕрдЬреАрдм рдирд┐рд░реНрджреЗрд╢ рдореМрдЬреВрдж рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХрд╛ рдЕрдкрдирд╛ рдкрд╕рдВрджреАрджрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛!

Source: https://habr.com/ru/post/hi467083/


All Articles