C语言学习中关于“权限修改问题”的解法心得

    科技2024-05-18  97

    问题描述:

    在学习Linux操作系统中文件通过显示 rwx 的方式来表示权限, r 表示可读、 w 表示可写、 x 表示可执行。 在操作系统实现以上功能时, 采用的方式是按位存储的。当我们不给任何权限时,存储表现为三个二进制位 000 ,如果可读则表示为 100 , 如果可写则表示为 010, , 如果可执行则表示为 001 。 我们希望在文件当前权限基础上,添加或删除权限【对已经存在(或不存在)的权限添加(或删除)不做改变】,你需要输出最终改变后的权限的十进制描述。

    我的第一次代码

    通过分支结构完成题目要求,主函数显得。。。(没水平)

    #include <stdio.h> int main () { int a[3] = {0, 0, 0}; char b[3]; scanf("%s", b); for (int i = 0; i < 3; i++) { if (b[i] == 'r') a[0] = 1; if (b[i] == 'w') a[1] = 1; if (b[i] == 'x') a[2] = 1; } //转换成对应的值 char c[2]; while (scanf("%s", c) != EOF) { if (c[0] == '+') { if (c[1] == 'r') a[0] = 1; else if (c[1] == 'w') a[1] = 1; else if (c[1] == 'x') a[2] = 1; } else { if (c[1] == 'r') a[0] = 0; else if (c[1] == 'w') a[1] = 0; else if (c[1] == 'x') a[2] = 0; } //条件语句进行分支 } printf("%d\n", 4 * a[0] + 2 * a[1] + a[2]); return 0; }

    代码分析:

    这道题目用分支结构显得有些复杂,如果采用位运算会不会更加简洁明了呢?想到这里,我忍不住动了动手……

    优化方案:

    这么一整理,高大上了好多,O(∩_∩)O哈哈~

    #include <stdio.h> void change(int x[], char y[]); void change1(int x1[], char y); void change2(int x2[], char y); int main() { int a[3] = {0, 0, 0}; char b[3]; scanf("%s", b); change(a, b); char c[2]; while (~scanf("%s", c)) { //使用位运算符简化表达式 if (c[0] == '+') change1(a, c[1]); else change2(a, c[1]); } //条件分支封装成函数,减少主函数的篇幅 printf("%d", a[0] | a[1] | a[2]); //使用位运算进行装X,看起来很厉害的丫子~ return 0; } void change(int x[], char y[]) { //转换成对应的值 for (int i = 0; i < 3; i++) { if (y[i] == 'r') x[0] = 4; if (y[i] == 'w') x[1] = 2; if (y[i] == 'x') x[2] = 1; } } void change1(int x1[], char y) { //当符号为‘+’时,选择该函数进行转换 if (y == 'r') x1[0] = 4; if (y == 'w') x1[1] = 2; if (y == 'x') x1[2] = 1; } void change2(int x2[], char y) { //当符号为‘-’时,选择该函数进行转换 if (y == 'r') x2[0] = 0; if (y == 'w') x2[1] = 0; if (y == 'x') x2[2] = 0; }
    Processed: 0.017, SQL: 9