前面 52 题可以看下 《c语言基础程序——经典100道实例。》
c语言基础程序——经典100道实例
053,按位异或 ^
题目: 学习使用按位异或 ^。
问题分析: 按位异或有 4 种情况,相同的为 0 ,不同的为 1 。
- 0 ^ 0=0;
- 0 ^ 1=1;
- 1 ^ 0=1;
- 1 ^ 1=0;
/**
* Created by 公众号:数据结构和算法
* Copyright wansuanfa.com All rights reserved.
*/
#include<stdio.h>
void printBinary(int num) {
// 打印二进制
for (int i = 31; i >= 0; i--) {
int bit = (num >> i) & 1;
printf("%d", bit);
if (i % 8 == 0)// 每8个加一个空格
printf(" ");
}
printf("\n");
}
int main() {
int a = 17, b = 13;
printf("整数 a 的值是:%d,二进制表示如下:\n", a);
printBinary(a);
printf("整数 b 的值是:%d,二进制表示如下:\n", b);
printBinary(b);
int xor = a ^ b;
printf("a 和 b 按位 ^ 的值是:%d,二进制表示如下:\n", xor);
printBinary(xor);
return 0;
}
运行结果:
整数 a 的值是:17,二进制表示如下:
00000000 00000000 00000000 00010001
整数 b 的值是:13,二进制表示如下:
00000000 00000000 00000000 00001101
a 和 b 按位 ^ 的值是:28,二进制表示如下:
00000000 00000000 00000000 00011100
054,取数右端4~7位
题目: 取一个整数 a 从右端开始的 4~7 位。
问题分析: 假设最右边的是第 1 位,步骤如下:
1,先使 a 右移 3 位(右边的3为舍弃,后面从第4位开始截取)
2,设置一个低 4 位全为 1,其余全为 0 的数,因为 -1 的二进制全是 1 ,可以让它左移 4位,然后取反。
3,将上面二者进行 & 运算即可。
/**
* Created by 公众号:数据结构和算法
* Copyright wansuanfa.com All rights reserved.
*/
#include<stdio.h>
void printBinary(int num) {
// 打印二进制
for (int i = 31; i >= 0; i--) {
int bit = (num >> i) & 1;
printf("%d", bit);
if (i % 8 == 0)// 每8个加一个空格
printf(" ");
}
printf("\n");
}
int main() {
int a, b, c;
printf("请输入整数:\n");
scanf("%d", &a);
printf("数字 a 的二进制是:\n");
printBinary(a);
a >>= 3;// 往右移3位
// -1 的二进制都是 1 ,即……1111111,左移4位变成……1110000
b = (-1) << (7 - 4 + 1);
b = ~b;// 取反变成……0001111,前面都是 0 。
c = a & b;// 截取 a 的四位。
printf("数字 a 右边的4到7位是:\n", c);
printBinary(c);
return 0;
}
运行结果:
请输入整数:
206
数字 a 的二进制是:
00000000 00000000 00000000 11001110
数字 a 右边的4到7位是:
00000000 00000000 00000000 00001001
055,按位取反~
题目: 学习使用按位取反~。
问题分析: 二进制中 0 变成 1 ,1 变成 0 。
/**
* Created by 公众号:数据结构和算法
* Copyright wansuanfa.com All rights reserved.
*/
#include<stdio.h>
void printBinary(int num) {
// 打印二进制
for (int i = 31; i >= 0; i--) {
int bit = (num >> i) & 1;
printf("%d", bit);
if (i % 8 == 0)// 每8个加一个空格
printf(" ");
}
printf("\n");
}
int main() {
int a = 203;
printf("a 的二进制表示如下:\n");
printBinary(a);
a = ~a;
printf("a 按位取反之后的二进制表示如下:\n");
printBinary(a);
return 0;
}
运行结果:
a 的二进制表示如下:
00000000 00000000 00000000 11001011
a 按位取反之后的二进制表示如下:
11111111 11111111 11111111 00110100
056,画圆形
题目: 画圆形。
问题分析: 这里是通过windows.h头文件来绘制圆,圆的绘制在WindowProc函数中。
/**
* Created by 公众号:数据结构和算法
* Copyright wansuanfa.com All rights reserved.
*/
#include <windows.h>
// 窗口过程函数,处理窗口的消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
LPARAM lParam) {
HDC hdc; // 设备上下文句柄,用于绘制
PAINTSTRUCT ps; // 绘制结构,包含绘制所需的信息
RECT rect; // 矩形区域,用于定义圆的位置和大小
switch (uMsg) {
case WM_PAINT: // 窗口需要重绘时发送的消息
hdc = BeginPaint(hwnd, &ps); // 准备绘制
// 矩形的左上角(100, 100),右下角(300, 300)
SetRect(&rect, 100, 100, 300, 300);
// 使用Ellipse函数绘制圆
Ellipse(hdc, rect.left, rect.top,
rect.right, rect.bottom);
EndPaint(hwnd, &ps); // 结束绘制
break;
case WM_DESTROY: // 窗口被销毁时发送的消息
PostQuitMessage(0); // 发送退出消息,结束应用程序
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
// WinMain函数,Windows应用程序的入口点
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow) {
WNDCLASS wc = {
0}; // 窗口类结构体,用于注册窗口类
// 设置窗口类参数
wc.lpfnWndProc = WindowProc; // 窗口过程函数
wc.hInstance = hInstance; // 当前实例句柄
wc.lpszClassName = "MyWindowClass"; // 窗口类名
wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); // 背景画刷
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 光标
wc.style = CS_HREDRAW | CS_VREDRAW; // 窗口风格
// 注册窗口类
RegisterClass(&wc);
// 创建窗口
HWND hwnd = CreateWindowEx(
0, // 扩展风格
"MyWindowClass", // 窗口类名
"该圆由 \"公众号:数据结构和算法\" 绘制", // 窗口标题
WS_OVERLAPPEDWINDOW, // 窗口风格
CW_USEDEFAULT, CW_USEDEFAULT, 500, 400, // 位置和大小
NULL, // 父窗口
NULL, // 菜单
hInstance, // 实例句柄
NULL // 附加数据
);
ShowWindow(hwnd, nCmdShow); // 显示窗口
UpdateWindow(hwnd); // 更新窗口
MSG msg; // 消息结构体,用于接收消息
// 消息循环
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg); // 翻译消息
DispatchMessage(&msg); // 分发消息
}
return (int) msg.wParam; // 返回消息参数
}
运行结果:
057,画直线
题目: 画直线。
问题分析: 这里是通过windows.h头文件来绘制直线,直线的绘制在WindowProc函数中。
/**
* Created by 公众号:数据结构和算法
* Copyright wansuanfa.com All rights reserved.
*/
#include <windows.h>
// 窗口过程函数,处理窗口的