【ARM 嵌入式 C 入门及渐进 14 -- C 代码中取余与取模的使用介绍】
请阅读【嵌入式开发学习必备专栏 】
文章目录
- 背景
- 示例
背景
有些文件每行是固定的字符个数,那么如果任意给个字符的序号,怎么通过C 代码获取该字符所在的行呢?
处理这个问题就要用到 C 语言中的取余和取模运算了。
示例
在 C 语言中,可以通过以下函数实现根据给定的起始位 start_bit
计算它所在的行号(假设每行有固定的32个字符)。我们可以假设每个字符占用1个位,即每行32位。函数将返回计算出的行号,其中行号从1开始计数。
#include <stdio.h>
// 函数声明
int calculate_line_number(int start_bit);
int main(void)
{int start_bit = 65; // 示例:查找第65位所在的行int line_number = calculate_line_number(start_bit);printf("The bit at position %d is on line %d.\n", start_bit, line_number);return 0;
}
// 函数定义
int calculate_line_number(int start_bit)
{const int bits_per_line = 32; // 每行32个字符,假设每个字符占用1个位int line_number;// 计算行号,从1开始计数line_number = (start_bit / bits_per_line) + ((start_bit % bits_per_line) > 0 ? 1 : 0);return line_number;
}
在这个函数中,我们首先定义了每行的位数 bits_per_line
为32。我们使用整数除法 start_bit / bits_per_line
来计算基本的行数,并使用取余运算符 %
检查是否有额外的位数,如果有,表明 start_bit
位于下一行,因此行号需要加1。
这里的主要逻辑是,如果 start_bit
正好是 bits_per_line
(32) 的倍数,它将位于 start_bit / bits_per_line
的行,否则位于 start_bit / bits_per_line
+ 1 的行。
在 main
函数中,我们调用 calculate_line_number
函数并传入示例起始位 65
,然后打印出结果。按照这个逻辑,位65将位于第3行,因为 65 / 32
的商是2,余数是1,所以它位于第2行的下一行,即第3行。
假设给定字符长度为 bits_len
,若要将这些字符全部拷贝 需要拷贝多少行数据?
可以编写如下函数:
#include <stdio.h>
// 函数声明
int calculate_lines_to_copy(int bits_len);
int main(void)
{int bits_len = 65; // 示例:需要拷贝的字符数int lines_to_copy = calculate_lines_to_copy(bits_len);printf("Need to copy %d lines for %d characters.\n", lines_to_copy, bits_len);return 0;
}
// 函数定义
int calculate_lines_to_copy(int bits_len) {const int chars_per_line = 32; // 每行固定32个字符int lines;// 计算需要拷贝的行数lines = bits_len / chars_per_line;// 如果 bits_len 不是 chars_per_line 的整数倍,则需要多拷贝一行if (bits_len % chars_per_line != 0) {lines++;}return lines;
}
在这个函数 calculate_lines_to_copy
中,我们定义了每行的字符数 chars_per_line
为32。函数使用整数除法 bits_len / chars_per_line
来计算基本的行数,并使用取余运算符 %
检查是否有剩余的字符,如果有,表明 bits_len
超出了整数行,因此需要额外拷贝一行。
在 main
函数中,我们调用 calculate_lines_to_copy
函数并传入示例长度 65
,然后打印出需要拷贝的行数。按照这个逻辑,对于65个字符,需要拷贝的行数将是3行,因为 65 / 32
的商是2,余数是1,所以需要在第2行的基础上再加1行。