c语言基础程序——经典100道实例(二)


前面 52 题可以看下 《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>

// 窗口过程函数,处理窗口的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据结构和算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值