问题:C编程语言的练习2-8,"写一个函数rightrot(x,n),它返回整数x的值,向右旋转n个位置."
我以各种方式完成了这项工作.这是我遇到的问题.给这个练习一个给定的数字,比如29,然后将它旋转到一个位置.
11101,它变为11110或30.假设为了论证,我们正在处理的系统的无符号整数类型大小为32位.让我们进一步说,我们将数字29存储在无符号整数变量中.在内存中,数字将在它之前有27个零.因此,当我们使用几种算法中的一种旋转29右边时,我们得到了数字2147483662.这显然不是理想的结果.
unsigned int rightrot(unsigned x, int n) {
return (x >> n) | (x << (sizeof(x) * CHAR_BIT) - n);
}
Run Code Online (Sandbox Code Playgroud)
从技术上讲,这是正确的,但我认为11101前面的27个零是微不足道的.我还尝试了其他一些解决方案:
int wordsize(void) { // compute the wordsize on a given machine...
unsigned x = ~0;
int b;
for(b = 0; x; b++)
x &= x-1;
return x;
}
unsigned int rightrot(unsigned x, int n) {
unsigned rbit;
while(n --) {
rbit = x >> 1;
x |= (rbit << wordsize() - 1);
}
return x;
Run Code Online (Sandbox Code Playgroud)
这个最后也是最后一个解决方案就是我认为我拥有它的解决方案,一旦我走到尽头,我将解释它失败的地方.我相信你会看到我的错误...... …
所以,我正在研究一个基于Linux的命令行实用程序,它必须接受一些标志,我注意到了一些有趣的行为.我将发布我在主实用程序之外使用的测试代码.我正在使用这段代码,所以在我可以插入工作代码之前,我没有必要改变实际的实用程序.所以这是我一直在摆弄的代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
while(--argc && (*++argv)[0] == '-')
putchar('*');
printf("\n%s\n", argv[0]);
}
Run Code Online (Sandbox Code Playgroud)
请忽略这样一个事实,即所有这个程序都打印星号,并在使用一个参数-b调用时打印自己的名称.打印星号只是为了表明循环运行一次.所以,我在终端中以"./test -n"运行它,我希望输出为:
*./测试
令我惊讶的是,输出结果如下:
*-b
我有一个关于声明(*++argv)[0]正在做什么的工作理论
,但我仍然有点朦胧.我的假设是它遍历指针数组,查看指向的每个字符串中的第一个字符,(*++argv)[0]现在*argv[0]是第一个参数字符串的解除引用或元素零.
所以,基本上我有三个问题:
我现在对此感到很困惑,并尝试了我能想到的一切来解决这个问题.有一次我有一个打印字母表的循环,我不知道程序访问的内存部分.最有趣的排列是从某个地方提取sshid变量.
提前感谢大家的帮助.