小编Bra*_*don的帖子

C中的位旋转

问题: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)

这个最后也是最后一个解决方案就是我认为我拥有它的解决方案,一旦我走到尽头,我将解释它失败的地方.我相信你会看到我的错误...... …

c bit-manipulation

6
推荐指数
1
解决办法
8767
查看次数

对argc,argv及其用法的有趣观察

所以,我正在研究一个基于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]是第一个参数字符串的解除引用或元素零.

所以,基本上我有三个问题:

  1. 这句话到底在做什么?
  2. 为什么我不能回到argv [0]或argv [0] [0],无论我尝试什么?
  3. 将值存储在另一个char*中argv [0]指向的地址,这是我此时能够访问该值的唯一方法,这是正常的方法吗?

我现在对此感到很困惑,并尝试了我能想到的一切来解决这个问题.有一次我有一个打印字母表的循环,我不知道程序访问的内存部分.最有趣的排列是从某个地方提取sshid变量.

提前感谢大家的帮助.

c linux pointers argv

3
推荐指数
1
解决办法
443
查看次数

标签 统计

c ×2

argv ×1

bit-manipulation ×1

linux ×1

pointers ×1