Tôi đang cố in nhị phân bằng mặt nạ bit 32 bit trong c, nhưng biểu diễn nhị phân không được in trong câu lệnh if.
unsigned int bit_mask = 2147483648;
int thập phân = 2;
printf("\nBiểu diễn nhị phân của 2: \n");
while(bit_mask > 0){
if((thập phân & bit_mask) == 0)
printf("0");
khác
printf("1");
bit_mask = bit_mask >> 1;
}
số thập phân = 255;
printf("\n\nBiểu diễn nhị phân của 255: \n");
while(bit_mask > 0){
if((thập phân & bit_mask) == 0)
printf("0");
khác
printf("1");
bit_mask = bit_mask >> 1;
}
số thập phân = 32;
printf("\n\nBiểu diễn nhị phân của 32: \n");
while(bit_mask > 0){
if((thập phân & bit_mask) == 0)
printf("0");
khác
printf("1");
bit_mask = bit_mask >> 1;
}
số thập phân = -1;
printf("\n\nBiểu diễn nhị phân của -1: \n");
while(bit_mask > 0){
if((thập phân & bit_mask) == 0)
printf("0");
khác
printf("1");
bit_mask = bit_mask >> 1;
}
số thập phân = -255;
printf("\n\nBiểu diễn nhị phân của -255: \n");
while(bit_mask > 0){
if((thập phân & bit_mask) == 0)
printf("0");
khác
printf("1");
bit_mask = bit_mask >> 1;
}
int Random_number = (Rand() % INT_MAX) + (Rand() % INT_MIN);
printf("\n\nBiểu diễn nhị phân của %d: \n", số ngẫu nhiên);
while(bit_mask > 0){
if((random_number & bit_mask) == 0)
printf("0");
khác
printf("1");
bit_mask = bit_mask >> 1;
}
PS: Chương trình này hiện chỉ dành cho 2
, nhưng các giá trị khác (255, 32, -1, -255) vẫn không được in
Nếu sửa theo đề xuất của BLUEPIXY và bản thân tôi, mã sẽ tạo ra câu trả lời đúng cho chuỗi bit.
#include
int main(void)
{
for (giá trị không dấu = 2; giá trị < 1024; giá trị = giá trị * 3 + 1)
{
bit_mask không dấu = 0x80000000; // 2147483648
printf("Biểu diễn nhị phân của %3u: ", value);
trong khi (bit_mask > 0)
{
nếu ((giá trị & bit_mask) == 0)
printf("0");
khác
printf("1");
bit_mask >>= 1;
}
putchar('\n');
}
return 0;
}
Đầu ra:
Biểu diễn nhị phân của 2: 00000000000000000000000000000000010
Biểu diễn nhị phân của 7: 000000000000000000000000000000111
Biểu diễn nhị phân của 22: 000000000000000000000000000010110
Biểu diễn nhị phân của 67: 000000000000000000000000001000011
Biểu diễn nhị phân của 202: 000000000000000000000000011001010
Biểu diễn nhị phân của 607: 000000000000000000000001001011111
mặc dùBLUEPIXYLàm thế nào, đầu ra không bị đảo ngược ở comments nói vào.
Thân vòng lặp có thể được chuyển đổi thành một hàm, ví dụ void print_binary(giá trị không dấu)
với nỗ lực tối thiểu và sau đó gọi nó từ vòng lặp. Thật buồn cười khi một câu hỏi chỉnh sửa có ít nhiều vòng lặp giống nhau lại được viết sáu lần (!) - đừng viết mã như vậy. Khi bạn sao chép và dán mã như thế, sẽ có một hàm đang chờ được viết.
#include
void print_binary(giá trị không dấu)
{
bit_mask không dấu = 0x80000000; // 2147483648
trong khi (bit_mask > 0)
{
nếu ((giá trị & bit_mask) == 0)
printf("0");
khác
printf("1");
bit_mask >>= 1;
}
}
Chức năng này có thể được sử dụng để in int không dấu
biểu diễn nhị phân mà không có bất kỳ sửa đổi nào. Nói chung có thể được sử dụng hợp lý. Trong ngữ cảnh cụ thể này, bạn có thể viết hàm bao bọc để xử lý các định dạng khác:
void fmt_binary(giá trị int)
{
printf("Biểu diễn nhị phân của %3d: ", value);
print_binary((unsigned)value);
putchar('\n');
}
Miễn là có trong phạm vi print_binary()
nguyên mẫu (prototype) thì không cần ép kiểu. Bắt đầu với C99, bạn phải khai báo hàm nhưng không nhất thiết phải là nguyên mẫu. Tuy nhiên, việc biên dịch mà không có nguyên mẫu là điều ngu ngốc. Bạn nên tìm các tùy chọn để đảm bảo trình biên dịch sẽ nhắc khi bạn cố gắng bỏ qua. Đối với GCC bạn có thể sử dụng:
gcc -std=c11 -O3 -g -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes …
Bạn có thể thêm hoặc không -Wold-style-khai báo
hoặc -Wold-kiểu-định nghĩa
Phụ thuộc vào cơ sở mã bạn đang xử lý và GCC bạn đang sử dụng (và mức độ bất cẩn của bạn khi viết mã). Bạn cũng có thể xem xét các lựa chọn khác như -Wshadow
, nhưng nếu mã của bạn biên dịch rõ ràng như được hiển thị, bạn sẽ không gặp phải nhiều vấn đề không phải là vấn đề logic.
được xác địnhfmt_binary()
, bạn có thể viết như thế nàychủ yếu()
:
#include
#include
#include
#include
// … khai báo hoặc định nghĩa của fmt_binary và print_binary
int main(void)
{
for (giá trị int = 2; giá trị < 1024; giá trị = giá trị * 3 + 1)
fmt_binary(giá trị);
fmt_binary(2);
fmt_binary(255);
fmt_binary(32);
fmt_binary(-1);
fmt_binary(-255);
srand(time(0)); // Tốt hơn là không gọi srand()
int Random_number = (Rand() % INT_MAX) + (Rand() % INT_MIN);
fmt_binary(random_number);
return 0;
}
Đầu ra ví dụ có thể là:
Biểu diễn nhị phân của 2: 00000000000000000000000000000000010
Biểu diễn nhị phân của 7: 000000000000000000000000000000111
Biểu diễn nhị phân của 22: 000000000000000000000000000010110
Biểu diễn nhị phân của 67: 000000000000000000000000001000011
Biểu diễn nhị phân của 202: 000000000000000000000000011001010
Biểu diễn nhị phân của 607: 000000000000000000000001001011111
Biểu diễn nhị phân của 2: 00000000000000000000000000000000010
Biểu diễn nhị phân của 255: 000000000000000000000000011111111
Biểu diễn nhị phân của 32: 000000000000000000000000000100000
Biểu diễn nhị phân của -1: 111111111111111111111111111111111
Biểu diễn nhị phân của -255: 1111111111111111111111100000001
Biểu diễn nhị phân của -1758826555: 10010111001010100110111111000101
Tôi là một lập trình viên xuất sắc, rất giỏi!