30/09/2018, 16:02

Poll: Kiểm tra kiến thức C - 1.16

Các bạn thảo luận đáp án nhé, bài test lấy từ http://www.indiabix.com/online-test/c-programming-test/11
16.What will be the output of the program?

#include<stdio.h>

int main()
{
    char c=48;
    int i, mask=01;
    for(i=1; i<=5; i++)
    {
        printf("%c", c|mask);
        mask = mask<<1;
    }
    return 0;
}
  • A. 12400
  • B. 12480
  • C. 12500
  • D. 12556
Đỗ Trung Quân viết 18:08 ngày 30/09/2018

@ltd help

Here mask means unsigned int i.e no negative values....mask 01 means 32 bit value.it is "00000000000000000000000000000001"
c=48 it is written as "00000000000000000000000000110000"
now "or" operation is performed then value becomes 49,
mask=mask<<1 means it shifts 1 to 1-bit before then it becomes "000000000000000000000000000000010".now do o operation with 32digit binary bit of 48.
Now value becomes 50.again mask=mask<<1 "00000100"(last 8bits)similarly do till for loop fails..then we get values as 49,50,52,56,48....the %c converts int to char thatmeans it prints the ASCII values of these nunbers ASCII of 48=0,49=1,50=2......57=9..replace the values u get o/p as 12480......
Lê Đình Huy viết 18:12 ngày 30/09/2018

những bài này khó thật đấy. Ngồi nhìn miết k ra đc

Dũng Kon viết 18:11 ngày 30/09/2018

110000 | 000001 ==> 110001 ==> 49(1)
110000 | 000010 ==> 110010 ==> 50(2)
110000 | 000100 ==> 110100 ==> 52(4)
110000 | 001000 ==> 111000 ==> 56(8)
110000 | 010000 ==>1000000 ==> tràn số, quay về lại số 0
==> đáp án là 12480. Độ chính xác của bài này là 90% còn cái tràn số không dám chắc

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

@Dung_Kon tính khiếp quá, cái này a bỏ vào IDE compile chạy xẹt xẹt chứ không tính. Giờ già rồi lười suy nghĩ mấy cái này.

À hay @Dung_Kon làm một bài hướng dẫn cách tính các phép toán này trên nhị phân đi?

Dũng Kon viết 18:18 ngày 30/09/2018

Em dốt mấy cái này lắm anh ơi, trả qua thấy người ta hỏi thì trả lời thôi. Đợi thời gian nữa trình lên đã chứ viết bừa mấy bạn hiểu sai, hiểu lầm nữa thì toi

Phương Lê viết 18:09 ngày 30/09/2018

Chọn B. 12480
Số 48 = 32 + 16 hệ cơ số 10 đổi sang hệ cơ số 2: các vị trí lần lượt là: 2^5; 2^4; 2^3; 2^2; 2^1; 2^0
2^5 = 32 tại vị trí này hệ cơ số 2 có giá trị bằng 1, các chỗ khác có giá trị bằng 0
2^4 = 16 tương tự như trên, do đó ta được dãy số hệ 2 là: 0011 0000 (8 bits, 2 nhóm 4)
Số 01 hệ cơ số 10 đổi sang hệ cơ số 2: 0000 0001
Các phép toán bit của số nguyên:
1|1 = 1; 1|0 = 1; 0|1 = 1; 0|0 = 0
X << Y đẩy y bit của x sang trái và điền các trị 0 vào chỗ các bit đã dịch chuyển đi.
Phép | thực hiện hai số hệ cơ số 2 theo từng cột tương ứng.
1: 0011 0000 | 0000 0001 = 0011 0001; 0000 0001 << 1 = 0000 0010
2: 0011 0000 | 0000 0010 = 0011 0010; 0000 0010 << 1 = 0000 0100
3: 0011 0000 | 0000 0100 = 0011 0100; 0000 0100 << 1 = 0000 1000
4: 0011 0000 | 0000 1000 = 0011 1000; 0000 1000 << 1 = 0001 0000
5: 0011 0000 | 0001 0000 = 0011 0000; 0001 0000 << 1 = 0010 0000
Phép dời sang trái hệ cơ số 2 số mũ tăng một đơn vị 2^0; 2^1; 2^2; 2^3 … 1; 2; 4; 8 … và giá trị tăng 10 lần 0000 0010; 0000 0100; 0000 1000; 0001 0000 …
printf %c: từ số thứ tự ASCII in ký tự
Đổi số từ hệ 2 sang hệ 10: 0011 0001 = 22^7 + 02^6 + 02^5 + 02^4 + 02^3 + 02^2 + 02^1 + 02^0 = 0 + 0 + 32 + 16 + 0 + 0 + 0 + 1
0011 0001 = 49 ký tự số 1
0011 0010 = 50 ký tự số 2
0011 0100 = 52 ký tự số 4
0011 0000 = 56 ký tự số 8
0011 1000 = 48 ký tự số 0
Các phím ở bàn phím số.
Phép | Or Logic không tăng giá trị khác với kết quả tăng từ 1, 2, 4, 8 và rồi giảm xuống 0
Phép << Dời sang trái giá trị mới tăng 1, 2, 4, 8 …
Just reference.

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

Phương tính cái này kinh quá, chuẩn Cảm ơn Phương đã giải thích cho mọi người nhé.

Dũng Kon viết 18:12 ngày 30/09/2018

thank @phuongle71104 nhé, mình không chắc đáp án, cảm ơn bạn

Bài liên quan
0