23 thg 10, 2010

Mặc định Dùng toán tử bit để đổi giá trị 2 biến

hôm đọc một bài thấy bác langman có dùng cái này để đổi giá trị của 2 biến rất hay

PHP Code:
a^=b^=a^=b
mình tìm lại trên diễn đàn mà không thấy đâu cả. Theo mình biết thì a^=b <=> a = a^b. đây là phép toán XOR . Bác nào giải thích hộ mình với .

mình hiểu thế này không biết đúng không .
ví dụ a = 2(a = 10 - nhi phan), b = 3 (b = 11 - nhi phan);
a^=b^=a^=b
thực hiện từ phải sang trái a^= b <=> a = a^b = 01 = 1;
b^=a^=b <=> b = b^(a^=b) = 11^01 = 10 = 2;
a^=b^=a^=b <=> a = a^(b^=a^=b) = 01^10 = 11 = 3;




toán tử bit thao tác trên từng bit tương ứng, (bit thứ i của a sẽ được thực hiện tương ứng với bit thứ i của b)

vì vậy trong th này để chứng minh ta chỉ cần chứng minh trên 1 bit thui
đơn giản nhất là ta lập bảng chân lý là thấy ngay


Mở rộng linh tinh thêm về toán tử trên bit
+ a&1 để kiểm tra tính chẵn lẻ của a,
hoặc đọc bit cuối của a trong bài toán đổi sang nhị phân
( mở rộng thêm là ta dùng dùng a>=0 để đọc bít đầu của a)

+ dùng toán tử | có thể giúp ta thay đổi 1 bit của 1 số nào đó
toán tử này được áp dụng rất nhiều trong các kĩ thuật cờ hiệu

.........
hì hì, tạm thời ko nhớ hết


Bạn ghi ra thành 3 dòng sẽ hiểu, cái này IT vay mượn từ Maths, để ý là C/C++ evaluate từ phải qua trái.
Code:
1. a ^= b ^= a ^= b;  
-> a = a ^ b;
2. a ^= b^ =a ^=b ;
-> b = b ^ a;
3. a ^= b ^= a ^= b;
-> a = a ^ b;
Ghi lại :
C++ code:
1. a = a ^ b;
2. b = b ^ a;
3. a = a ^ b;






Từ (1) và (2)
-> b = b ^ a= b ^ ( a ^ b ) = ( b ^ b ) ^ a = 0 ^ b = a
Từ (3)
-> a = a ^ b = ( a ^ b ) ^ a = ( a ^ a ) ^ b = 0 ^ b = b
__________________
Cpp code:

#include <cstdio>
int main(){
  for(int i = -1; i++ < 1025; putchar("\n #"[(i%32<31)+((i/32&i)==i%32)]));
  return 0;
}

Không có nhận xét nào:

Đăng nhận xét