Bài toán lật bit

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 ??

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. :sweat_smile:

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

2 posts were merged into an existing topic: Topic lưu trữ các post off-topic - version 3

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?