рддреНрд░реБрдЯрд┐ рдФрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдорд╛рд░реНрдЬрд┐рди рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛

рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛рд░реНрдп рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрд╛рдпрд╛ рдерд╛ред рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╛рдзрд╛рди рдХрд╛рдлреА рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдирд┐рдХрд▓рд╛ред

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

рдиреЛрдЯ: рд▓реЗрдЦ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдЬрд╛рд╡рд╛ рдореЗрдВ рдмрдиреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рд╕рдордЭ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрд╛рд╣рд┐рд░ рд╣реИ, "рд╣реЗрдб-рдСрди" рд╕рдорд╛рдзрд╛рди - m = (ticks * 1000) / (2^15) рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдпреВрд░реЗрдХрд╛?


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

рддреНрд╡рд░рд┐рдд рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд, рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдИ (рдЙрд╕ 1000 = 1024 - 24 рдпрд╛рдж рдХрд░рддреЗ рд╣реБрдП):
ticks * 1000 * 2^(-15) =
ticks * 2^(-5) - ticks * 24 * 2^(-15) = ticks * 2^(-5) - 3 * ticks * 2^(-12)


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрд▓:
  private int getMillis(int ticks) { return (ticks >> 5) - 3*(ticks >> 12); } 

рд╕реБрдкрд░! рдмрд╣реБрдд рдмреБрд░рд╛ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдкрд╣рд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг


рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдЬрд╛рдБрдЪ рдХреА рдЧрдИ - рддрд░реНрдХ рдореЗрдВ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдирд╣реАрдВ рд╣реИрдВред рдореИрдВрдиреЗ рдХрдИ рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдЬрд╛рдБрдЪ рдХреА - рдРрд╕рд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдорд╛рдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд╣реАрдВред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, + -3 рджреНрд╡рд╛рд░рд╛ рд╕рд╣реА рдкрд░рд┐рдгрд╛рдо рд╕реЗ рд╡рд┐рдЪрд▓рди рд╣реЛрддреЗ рд╣реИрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЧрдгрд┐рдд рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ (рдЕрдиреНрдпрдерд╛ рдЙрддреНрддрд░ рд╕рддреНрдп рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реЛрддреЗ), рд▓реЗрдХрд┐рди рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИред

рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ, рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдмрд┐рдЯ рд╢рд┐рдлреНрдЯ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред N рд╕реЗ рджрд╛рдИрдВ рдУрд░ рдПрдХ рдмрд┐рдЯ рд╢рд┐рдлреНрдЯ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди n рдХреА рд╢рдХреНрддрд┐ рд╕реЗ 2 рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдСрдкрд░реЗрд╢рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрд┐рдЯреНрд╕ рдЬреЛ рдХрд┐ рд╢реВрдиреНрдп рдмрд┐рдЯ рдХреЗ "рджрд╛рдИрдВ рдУрд░" рд╣реИрдВ, рдХреЛ рдмрд╕ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореБрдЭреЗ рдкрд┐рдЫрд▓реЗ рдЦрд╛рд░рд┐рдЬ (рдорд╛рдЗрдирд╕-рдлрд░реНрд╕реНрдЯ) рдмрд┐рдЯ рдХрд╛ рд╕рдВрджреЗрд╣ рдерд╛, рд╢рд╛рдпрдж рдпрд╣ рд╡рд╣ рдерд╛ рдЬреЛ рдЧреБрдгрд╛ рдФрд░ рдЕрдВрддрд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рдЧрд╛рдпрдм рдерд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ:
  private int getMillis(int ticks) { int err = ((ticks & 16) >> 4) - 3 * ((ticks & 2048) >> 11); if (err < 0) { return (ticks >> 5) - 3 * (ticks >> 12) - (Math.abs(err) >> 1); } else { return (ticks >> 5) - 3 * (ticks >> 12) + (err >> 1); } } 

рдЧрд▓рдд рдЪрд░ рдореЗрдВ рд╣рдордиреЗ рдЙрд╕ рдмрд┐рдЯ рдХреЛ рдбрд╛рд▓ рджрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╢рд┐рдлреНрдЯ рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдлреЙрд░реНрдо x - 3 * y рдПрдХ рд╣реА рдСрдкрд░реЗрд╢рди рдЙрд╕ рдкрд░ рдЕрд▓рдЧ x - 3 * y рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, 4 рд╡реЗрдВ рдФрд░ 11 рд╡реЗрдВ рдмрд┐рдЯреНрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд╢реВрдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдСрдкрд░реЗрд╢рди рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдлрд┐рд░ рд╕реЗ 1 рдмрд┐рдЯ рджреНрд╡рд╛рд░рд╛ рджрд╛рдИрдВ рдУрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдирддреАрдЬрддрди, рдкрд╛рд░реА рдХреЗ рдмрд╛рдж рдЬреЛ рдХреБрдЫ рднреА рд░рд╣рддрд╛ рд╣реИ рд╡рд╣ рдЦреЛрдП рд╣реБрдП рдмрд┐рдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред
рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реБрдЖ рд╣реИ: рдЕрдм рдкреВрд░реНрдг рддреНрд░реБрдЯрд┐ 2 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдереАред

рдирд┐рд░реНрдгрдп


рдЕрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рд╡рд┐рдЪрд╛рд░ рдХреА рджрд┐рд╢рд╛ рд╕рд╣реА рдереА, рд▓реЗрдХрд┐рди рджрд╢рдорд▓рд╡ рдмрд┐рдВрджреБ рдХреЗ рджрд╛рдИрдВ рдУрд░ рди рдХреЗрд╡рд▓ рдПрдХ рдмрд┐рдЯ рдХреЛ рднрд╛рдЧ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд▓реНрдХрд┐ рд╕рднреА 5 рдЗрдВрдЯрд░рд╕реЗрдХреНрдЯрд┐рдВрдЧ рд╡рд╛рд▓реЗ (рдЬреЛ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЖрд░реЗрдЦ рдореЗрдВ -1 рд╕реЗ -5 рддрдХ рдХреЗ рдкрджреЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ)ред

рдирддреАрдЬрддрди, рдореБрдЭреЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдорд┐рд▓рд╛, рдЬрд┐рд╕рдХреА рддреНрд░реБрдЯрд┐ 0.5 рд╕реЗ рдХрдо рдереАред
рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рдерд╛, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрдВрдб рд╕реЗ 1 рдмрд┐рдЯ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди 5 рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рддреНрд░реБрдЯрд┐ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЧреЛрд▓рд╛рдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ i- th рдмрд┐рдЯ i + 1- рд╡реЗрдВ рдмрд┐рдЯ рдХреЗ рдЖрдзреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред

рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдХреЛрдб рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП :)
  private int getMillis(int ticks) { int l = (ticks & 0x1F) << 7; int r = ticks & 0xFFF; // 2^12 - 1 int err = l - 3 * r; int fraction = (Math.abs(err) & 0xFFF); int fractionRound = fraction >> 11; //== 1 <=> there is 0.5xxx fraction = fraction & 0x7FF; // 0.5xxx => 0.0xxx if (err < 0) { fraction = fraction > 0 ? 1 : 0; return (ticks >> 5) - 3 * (ticks >> 12) - (Math.abs(err) >> 12) - (fractionRound & fraction); } else { return (ticks >> 5) - 3 * (ticks >> 12) + (err >> 12) + fractionRound; } } 


рдЕрдЪреНрдЫреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдмрдиреЗрдВ рдФрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рд░рдЦреЗрдВ!

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


All Articles