30/09/2018, 16:12

[Wiki] Phép toán đảo bit - NOT

Đây là toán tử một ngôi thực hiện đảo các bit của toán hạng, các bit giá trị 1 trở thành 0
và bit giá trị 0 thành 1. Thực hiện trên kiểu số nguyên .
cú pháp :

~<toán_hạng> 

Ví dụ 1:

unsigned char c = 3, d; 
d = ~c; 

Kết quả

d = 252; 

Ví dụ 2:

unsigned int c = 3, d; 
d = ~c; 

Kết quả

d = 65532;
Nguyễn Quyền viết 18:21 ngày 30/09/2018

anh cho em hỏi nếu là kiểu số nguyên có dấu thì nó sẽ cho kết quả như nào vậy ạ

Nguyễn Minh Dũng viết 18:24 ngày 30/09/2018

Vấn đề đây là một phép toán đảo bit, nên là số âm hay số dương thì việc đảo bit đều được thực hiện giống nhau. Điểm đặc biệt là đối với số âm thì MSB (most significant bit) sẽ bằng 1. Thế nên ta sẽ đảo lại cho bằng 0.

#include <stdio.h>

int main() {
    int x = -3;
    char nhi_phan [33] = {0};
    itoa (x,nhi_phan,2);
    printf ("decial: %d\n",x);
    printf ("binary: %s\n",nhi_phan);
    x = ~x;
    printf ("decial: %d\n",x);
    itoa (x,nhi_phan,2);
    printf ("binary: %s\n",nhi_phan);
    return 0;
}

Trong ví dụ này ta đảo -3, kết quả in ra màn hình sẽ như sau

decial: -3
binary: 11111111111111111111111111111101
decial: 2
binary: 10

@ndg2394 thử giải thích tại sao kết quả lại như vậy xem?

Nguyễn Văn Thịnh viết 18:12 ngày 30/09/2018

Hi anh @ltd, em tình cờ gặp phải vấn đề về đảo bit. em lên mạng gg search và tình cờ đọc đc bài viết này. .Do chưa thấy câu trả lời và e cũng khá tò mò tìm câu trả lời nên mặc dù rep mang tính đào mộ .Em xin được giải thích code của anh.

itoa (x,nhi_phan,2);

Đây là nguyên mẫu của hàm:

char *  itoa (int value, char * str, int base);

Chuyển đổi một giá trị số nguyên thành một chuỗi được kết thúc bằng null bằng cách sử dụng cơ sở được chỉ định và lưu trữ kết quả trong mảng được cho bởi tham số str. Tại sao phải nhi_phan[33] thì trong đây viết rất rõ
http://www.cplusplus.com/reference/cstdlib/itoa/

int x = -3; // là 1 kiểu số nguyên có dấu 4byte có được bằng cách lấy bù 2 của 3 (được biểu diễn bằng 4*8=32 bits).
// https://vi.wikipedia.org/wiki/Bi%E1%BB%83u_di%E1%BB%85n_s%E1%BB%91_%C3%A2m
x=~x; // là phép toán đảo bit
itoa (x,nhi_phan,2); // tương tự

Cuối cùng ta đươc kết quả trên màn hình.
Lần đầu post cmt mang tính đóng góp lên 4room

Bài liên quan
0