рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ XOR рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрднреНрдпрд╛рд╕

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ XOR рдмрд┐рдЯ рдСрдкрд░реЗрд╢рди (рдПрдХреНрд╕рдХреНрд▓реВрд╕рд┐рд╡ OR) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдФрд░ JAVA рдкрд░ рдЗрд╕рдХреЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред

рддреЛ, XOR рдПрдХ рдРрд╕рд╛ рдСрдкрд░реЗрд╢рди рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ "рд╕рд╣реА" рдорд╛рди рд▓реЗрдиреЗ рдкрд░ "рд╕рд╣реА" рдорд╛рди рд▓реЗрддрд╛ рд╣реИред

рдЫрд╡рд┐



XOR рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреБрдг рд╣реИрдВ:

рдПрдХ XOR 0 = рдП
рдПрдХ XOR a = 0
рдПрдХ XOR b = b XOR a
(рдПрдХ рдПрдХреНрд╕рдУрдЖрд░ рдмреА) рдПрдХреНрд╕рдУрдЖрд░ рдмреА = рдП

рдЬрд╛рд╡рд╛ рднрд╛рд╖рд╛ рдореЗрдВ (рд╕рд╛рде рд╣реА рд╕реА, рд╕реА ++, рд╕реА #, рд░реВрдмреА, рдкреАрдПрдЪрдкреА, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ) рдореЗрдВ, рдСрдкрд░реЗрд╢рди "^" рдкреНрд░рддреАрдХ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЪрд░ рдорд╛рдиреЛрдВ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░реЗрдВ


рдПрдХреНрд╕рдУрдЖрд░ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ:
int x = 5, y = 7; x = x^y; // x == 2 y = x^y; // y == 5 x = x^y; // x == 7 

рдпрд╛ рдХрдо рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ:
  y ^= (x ^= y); x ^= y; 


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рд┐рд╡рд░реНрд╕ рдЯреЗрдХреНрд╕реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
  public static final String reverseWithXOR(String string) { char[] array = string.toCharArray(); int length = array.length; int half = (int) Math.floor(array.length / 2); for (int i = 0; i < half; i++) { array[i] ^= array[length - i - 1]; array[length - i - 1] ^= array[i]; array[i] ^= array[length - i - 1]; } return String.valueOf(array); } 




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

рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди


XOR- рдЖрдзрд╛рд░рд┐рдд рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
(рдПрдХ рдПрдХреНрд╕рдУрдЖрд░ рдХреЗ) рдПрдХреНрд╕рдУрдЖрд░ рдХреЗ = рдП
рдЬрд╣рд╛рдВ k - рдПрдХ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ

рд╕рд░рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
  public static byte[] encode(String pText, String pKey) { byte[] txt = pText.getBytes(); byte[] key = pKey.getBytes(); byte[] res = new byte[pText.length()]; for (int i = 0; i < txt.length; i++) { res[i] = (byte) (txt[i] ^ key[i % key.length]); } return res; } 


рдФрд░ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди:
  public static String decode(byte[] pText, String pKey) { byte[] res = new byte[pText.length]; byte[] key = pKey.getBytes(); for (int i = 0; i < pText.length; i++) { res[i] = (byte) (pText[i] ^ key[i % key.length]); } return new String(res); } 


рдЖрдЗрдП рд▓рд╛рдЗрди рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ "рдЗрди рдирд░рдо рдлреНрд░рд╛рдВрд╕реАрд╕реА рд░реЛрд▓ рдЦрд╛рдПрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЪрд╛рдп рд▓реЗрдВред" рдФрд░ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ "рд╣рдмреНрд░" рд╢рдмреНрдж рд▓реЗрдВ:



рдРрд╕реЗ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреА рдЕрдбрд╝рдЪрди рдпрд╣ рд╣реИ рдХрд┐ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдП рдЧрдП рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдХреБрдВрдЬреА рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдкреВрд░реЗ рдкрд╛рда рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЕрдкрдиреЗ рд╢реБрджреНрдз рд░реВрдк рдореЗрдВ, рдпрд╣ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдПрдХ рд╕рдордп рдореЗрдВ рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо Microsoft рджреНрд╡рд╛рд░рд╛ Office 95 рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

XORShift рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░


2003 рдореЗрдВ, рдЬреЙрд░реНрдЬ рдорд╛рд░реНрд╕рд╛рдЧреНрд▓рд┐рдпрд╛ рдиреЗ XOR - Xorshift рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреБрдирд┐рдпрд╛ рдХреЛ рдПрдХ рддреЗрдЬ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдкреАрдврд╝реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдпрд╛ ред

рдЗрд╕рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ:
 class XORShift { private long rnd; public XORShift(long rnd) { this.rnd = rnd; } public long getRandom() { this.rnd ^= (this.rnd << 21); this.rnd ^= (this.rnd >>> 35); this.rnd ^= (this.rnd << 4); return this.rnd; } } 


рдпрд╣рд╛рдВ "рдореИрдЬрд┐рдХ" рд╕рдВрдЦреНрдпрд╛ 21, 35 рдФрд░ 4 рдХреЛ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдЕрдиреБрдХреНрд░рдо рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИ (рдкреВрд░реНрдг рдЕрд╡рдзрд┐ 2 64 -1 рд╣реИ)ред
1111111111 рдирдВрдмрд░ рдХреЗ рд╕рд╛рде рдЬрдирд░реЗрдЯрд░ рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рдХреЗ, рд╣рдореЗрдВ рдкрд╣рд▓реЗ 10 рдирдВрдмрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдЕрдиреБрдХреНрд░рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:

39462749392662495
4596835458788324745
-7.932.128.052.244.037.525
-2.502.212.788.642.280.052
3288035714308340525
-8.561.046.377.475.020.727
-812160615072319265
-3.869.866.974.339.671.508
-7.329.504.029.400.927.428
3890915262874757420

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

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


All Articles