làm cách nào để thay đổi tất cả giá trị bit của một số nguyên nhập vào từ bàn phím ???
VD : input 1 <32bit>
output 4294967294
ở đây mối liên hệ là gì vậy ạ chỉ giúp e với ??
Bài toán lật bit
1 Like
Thì nó lật bit lại thôi.
0b00000000000000000000000000000001 = 1
Lật lại thành
0b11111111111111111111111111111110 = 4294967294
Kiểu uint
hoặc long
.
Các ngôn ngữ lập trình đều hỗ trợ toán tử ^ (xor)
3 Likes
Đây là phép toán not nhé bạn, hiểu đơn giản là nó đảo các bit 0 thành 1 và 1 thành 0.
Và có công thức tính nhanh not của một số
not N = (2^Len - 1) - N
Với N là số cần tính, Len là độ dài của chuỗi bit (ở ví dụ của bạn là 32 bit)
Với ví dụ của bạn thì công thức là
not 1 = (2^32 - 1) - 1
not 1 = 4 294 967 294
4 Likes
À quên phéng mất, ! (not
) cũng dùng trong trường hợp này.
2 Likes
Không phải, !
là logic NOT, bitwise là ~
.
5 Likes
Cảm ơn, giờ không lập trình gì nữa, chẳng nhớ kí hiệu toán tử nữa.
3 Likes
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
unsigned int n; cin >> n;
unsigned int _n=pow(2,32)-1-n;
cout << _n;
}
// công thức là 2^(số lượng bit)-1-n;
4 Likes
pow cho kết quả là số thực. 232 sẽ cho kết quả tràn số. Hãy sử dụng dịch bit.
unsigned int _n = (1 << 31) + ((1 << 31) - 1) - n; // né (1 << 32) - 1
// thực ra không né có thể không sao
Chịu chơi hơn nữa thì dùng
#include <limits>
unsigned int _n = numeric_limits<unsigned int>::max() - n;
tuy nhiên cách này không chính thống lắm.
Thực ra ~n
trên các kiểu unsigned cũng đều ra số dương cả, không cần trừ.
2 Likes