cinmay 发表于 2020-9-11 09:51:58

求大佬们解释下这个题

小弟刚刚学C,遇到这个题目看不懂,求大佬们帮忙并解释下
#include <stdio.h>
void set_flag(int* flag_holder, int flag_position);
int check_flag(int flag_holder, int flag_position);
int main(int argc, char* argv[])
{
int flag_holder = 0;
int i;
set_flag(&flag_holder, 3);
set_flag(&flag_holder, 16);
set_flag(&flag_holder, 31);
for(i=31; i>=0; i--){

    printf("%d", check_flag(flag_holder, i));
    if(i%4 == 0){
      
      printf(" ");
}
}
printf("\n");
return 0;
}
要求写出set_flag 和check_flag 的code
运行后结果如图


You can think of the set_flag function as taking an integer and making sure that the nth bit is a 1. The check_flag
function simply returns an integer that is zero when the nth bit is zero and 1 when it is 1. You may find the shifting
operators “<<”, and “>>” helpful as well as the bitwise operations & and |. If you find yourself using multiplication
or division in your solution then you are doing it wrong.

风过无痕1989 发表于 2020-9-11 10:42:33

本帖最后由 风过无痕1989 于 2020-9-11 11:13 编辑


暈~~晕~~晕~~,是让我写这两个函数呀?这题目出的太。。。。。(此处省略16个字)

set_flag 可以是个空函数,然后用 cheak_flag 函数硬凑你的那个答案,你没有理由说我错吧?

这样的题目,你们自己玩吧

风过无痕1989 发表于 2020-9-11 10:58:36

#include <stdio.h>
void set_flag(int* flag_holder, int flag_position);    // 声明函数 set_flag
int check_flag(int flag_holder, int flag_position);    // 声明函数 check_flag

int main(int argc, char* argv[])                     // 主函数
{
int flag_holder = 0;                                 // 给 flag_holder 整型变量赋初值
int i;
set_flag(&flag_holder, 3);                           // 调用 set_flag 函数
set_flag(&flag_holder, 16);                        // 调用 set_flag 函数
set_flag(&flag_holder, 31);                        // 调用 set_flag 函数
for(i=31; i>=0; i--)                                 // 循环 31 次调用 printf() 输出
{
    printf("%d", check_flag(flag_holder, i));          // 在 printf() 中调用函数 check_flag 函数的返回值
    if(i%4 == 0)                                       // 以下四行的作用是:输出四个值后,输出一个空格
        {
      
      printf(" ");
        }
}
printf("\n");                                        // 输出一个回车
return 0;
}


// 以下需要定义 set_flag 函数
void set_flag(int* flag_holder, int flag_position)
{
......
}


// 以下需要定义 check_flag 函数
int check_flag(int flag_holder, int flag_position)
{
......
}

cinmay 发表于 2020-9-11 11:12:30

本帖最后由 cinmay 于 2020-9-11 11:13 编辑

风过无痕1989 发表于 2020-9-11 10:42
你声明了两个函数,却没有定义这两个函数

这两个函数需要自己写出来,我不会{:10_254:}
我在看小甲鱼的视频,现学赶不上:(

风过无痕1989 发表于 2020-9-11 11:14:27

cinmay 发表于 2020-9-11 11:12
这两个函数需要自己写出来,我不会
我在看小甲鱼的视频,现学赶不上:(

前面 2楼 重新编辑已经回复你了

sunrise085 发表于 2020-9-11 13:21:52

本帖最后由 sunrise085 于 2020-9-11 14:39 编辑

You can think of the set_flag function as taking an integer and making sure that the nth bit is a 1. The check_flag
function simply returns an integer that is zero when the nth bit is zero and 1 when it is 1. You may find the shifting
operators “<<”, and “>>” helpful as well as the bitwise operations & and |. If you find yourself using multiplication
or division in your solution then you are doing it wrong.
题目的意思:
set_flag 函数将一个 int 类型数值的第 n 个字节位设置为1。check_flag 函数简单地返回一个 int 类型数字的第 n 个字节位是1还是0,。
你应该用到左移操作符"<<"和右移操作符">>",同时可能还需要用到位逻辑运算符 & 和 | 。如果你的程序中用到了乘/除,那说明你的程序编写错了。

题目就是让你用位操作符和位运算符来完成为设置和位查询功能

#include <stdio.h>
void set_flag(int* flag_holder, int flag_position);    // 声明函数 set_flag
int check_flag(int flag_holder, int flag_position);    // 声明函数 check_flag

int main(int argc, char* argv[])                     // 主函数
{
int flag_holder = 0;                                 // 给 flag_holder 整型变量赋初值
int i;
set_flag(&flag_holder, 3);                           // 调用 set_flag 函数
set_flag(&flag_holder, 16);                        // 调用 set_flag 函数
set_flag(&flag_holder, 31);                        // 调用 set_flag 函数
for(i=31; i>=0; i--)                                 // 循环 31 次调用 printf() 输出
{
    printf("%d", check_flag(flag_holder, i));          // 在 printf() 中调用函数 check_flag 函数的返回值
    if(i%4 == 0)                                       // 以下四行的作用是:输出四个值后,输出一个空格
      {
      
      printf(" ");
      }
}
printf("\n");                                        // 输出一个回车
return 0;
}


// 定义 set_flag 函数
void set_flag(int* flag_holder, int flag_position)
{
    int temp = 1;
    temp <<= flag_position;               //将temp 左移 flag_position 位,即将 1 左移 flag_position 位
    *flag_holder =* flag_holder|temp;   //原数值与 temp 进行位或运算,即修改第 flag_position 位为1
}


// 以下需要定义 check_flag 函数
int check_flag(int flag_holder, int flag_position)
{
    unsigned int temp = flag_holder;       //将flag_holder 改为无符号整型
    temp >>= flag_position;         //然后右移flag_position位,即将第 flag_position 位移动到最右边
    return temp&1;                  //将tenp与1进行位与运算,得到的就是第 flag_position位的值
}

风过无痕1989 发表于 2020-9-11 14:33:07

sunrise085 发表于 2020-9-11 13:21
题目的意思:
set_flag 函数讲一个 int 类型数值的第 n 个字节位设置为1。check_flag 函数简单地返回一 ...

他的求助标题是解释下这个题,最后变成了帮他写两个函数,我感觉被骗了。

还是你心好,达成了他的目的,最佳非你莫属

cinmay 发表于 2020-9-11 19:44:51

感谢两位的解答,现在清楚很多了,你们的帮助对初学者来说太重要了。

cinmay 发表于 2020-9-11 19:46:55

风过无痕1989 发表于 2020-9-11 14:33
他的求助标题是解释下这个题,最后变成了帮他写两个函数,我感觉被骗了。

还是你心好,达成了他的目的 ...

非常感谢你的帮助。

风过无痕1989 发表于 2020-9-12 02:17:33

cinmay 发表于 2020-9-11 19:46
非常感谢你的帮助。

下次发帖子请求帮助时,注意主要问题与次要问题,标题是主要问题,次要问题可在帖子中互动时提出来,这样首先解决的就是你的主要问题。

另,我也是初学者,每次回复问题,我当是对我的一次小考,以此来加深自己对概念的理解
页: [1]
查看完整版本: 求大佬们解释下这个题