#### 问题描述 在求反码时,表达式 x &= (x - 1) 用于把x最右边的值为1的位删除掉。请解释一下这样做的道理。用这一方法重写bitcount函数 ,使之执行得更快一点。 ------ #### 问题分解 - 主函数main - 核心函数 bitcount(x)。我们先来看看书中例子 bitcount的算法实现: ```c int bitcount(unsigned x) { int b; for(b = 0; x != 0; x >>= 1) { if(x & 1...
#### 问题描述 编写一个函数rightrot(x, n),该函数返回将x循环右移n位所得到的值。 这个问题的理解是: 将x进行右移n位,每次移动都将右侧的最后一位移到左侧第一位。 ------ #### 问题分解 - 主函数main - 核心函数 rightrot(x, n)。 这道题需要我们留心观察右移的规律,首先常规的右移很好表示,因此难点在如何表示右侧的最后一位移到左侧的第一位。通过分析,我们可以知道需要判断x的最右端位是1还是0,是1就进行特殊运算,若是0 ,直接右移即可。算法描述可以为: - 1. 当x的最后一位为0, 则只...
###问题描述 编写一个函数setbits(x, p ,n, y),该函数返回对x执行下列操作后的结果值: 将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。 ###问题分解 1. 主函数main 2. 核心函数 setbits(x, p ,n, y), 此函数是算法核心,要做的事情就是通过一系列的位运算达到目的。大概分为以下几个步骤: - 假设x = X7X6X5X4X3X2X1X0, p = 4, n = 3, y = Y7Y6Y5Y4Y3Y2Y1Y0, 那么根据题意,我们期望得到的结果应该是 : X7X6X5Y2Y1Y...
#### 问题描述 编写一个函数 invert(x, p, n),该函数返回对 x 执行下列操作后的结果值:将 x 中从第 p 位开始的 n 个(二进制)位求反(即,1 变成 0,0 变成 1),x 的其余各位保持不变。 ------ #### 问题分解 - 主函数main - 工具函数 setbits(x,p,n,y), 算法解析可以看上一篇文章 - 核心函数 invert(x, p ,n)。 这道题其实不难,只要联想一下2-6解决的问题,即可快速得到答案。我们来回顾一下2-6解决的问题:编写一个函数setbits(x, p ,n, y),该...
###问题描述 编写函数squeeze(s1, s2), 把字符串s1中与字符串s2中字符匹配的所有字符都删除。 ###问题拆分 - 主函数 main - 接收用户输入字符串函数 get_line (注意不能按照书本上的getline,因为此函数已在stdio.h 中定义了) - 从s1中移除s2中包含的字符 函数 squeeze ###代码实现 ```c #include #define LINE 1000 int get_line(char s[]); int squeeze(char s[], char search[]); i...
###问题描述 编写函数htoi(s), 把由十六进制数字组成的字符串(包含可选的前缀0X和0x),转化为与之等价的整数值, 字符串中包含的字符可以是0 - 9,A - F,a - f。 ###问题拆分 - 主函数main - 接收用户输入字符串函数 get_line (注意不能按照书本上的getline,因为次函数已在stdio.h 中定义了) - 将十六进制字符串转化成十进制整数的函数 htoi (这是核心) ###代码实现 ```c #include #define LINE 1000 //每行接收的最大字符数 #define DEC 1...