Манипуляции с битами. Игра в истину [https://nuancesprog.ru/p/4597]
| A | B | A xor B |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
a xor 0 = a
a xor 1 = not a
a xor a = 0
a xor b = b xor a
(a xor b) xor c = a xor (b xor c)
How to swap 2 variables:
[code language="java"] int x=5, y=7; x=x^y; //x==2 y=x^y; //y==5 x=x^y; //x==7 [/code]
or
[code language="java"] y^=(x^=y); x^=y; [/code]
or, change value of variable if it is only these two values:
[code language="java"] v ^= val1 ^ val2; [/code]
Crypto
(a xor k) xor k = a, where k is key
[code language="java"]
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;
}
[/code]
[code language="java"]
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);
}
[/code]
[code language="java"]
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;
}
}
[/code]
XOR is used to nil variable
K * 2^N [https://telegra.ph/UniLecs-129-Pobitovaya-arifmetika-09-23]
[https://telegra.ph/Anons-129-Pobitovaya-arifmetika-09-23]
Problem:
there is an array of natural numbers from 1 to n. Size is 2n-1. All numbers have a pair, except one. Find the one.
Solution: just xor all items in the array. Also sum of first N natural numbers is n*(n+1)/2