【问题标题】:C programming: Changing bits based on their position to 0C 编程:根据位置将位更改为 0
【发布时间】:2023-04-03 11:31:01
【问题描述】:

这个函数的代码是什么样的?抱歉,我是自学和编程新手

创建一个名为 reset_bits(int value, int pos, int n) 的函数,它将位位置 pos, pos + 1, ..., pos + n - 1 的 n 个连续位值中的每一个设置为位值0,并以十六进制打印结果。例如,reset_bits(0x8C3E, 2, 3) 会打印出 0x8C22,这是将 0x8C3E 的第 2、3、4 位位置设置为 0 的结果。可以假设 pos 和 n 指定的所有位位置都有效位位置。您可以使用的唯一 C 库函数是 printf()。

这是我一本关于 C 编程的书中的练习题,但我没有解决方案手册。

模板:

    #include <stdio.h>
    #include <limits.h>

 int reset_bits(int value, int position, int n) {
     int r = pos + 1;
     int l = pos + n;
     int range = (((0xFF << (r - 1)) - 1) ^ ((0xFF << (l) - 1));
     int answer = value | range;

  printf("%x", answer);
  printf("\n");
    }

    int main() {
        reset_bits(0x8C3E, 2, 3); 
    }

【问题讨论】:

  • 您需要向我们展示您尝试过的内容以及遇到的具体问题。我们在这里为您提供帮助,我们不是编码服务。请阅读help center 页面。
  • 欢迎来到 SO!看起来您没有编写任何代码。最好自己尝试一下,然后只有在遇到困难时才询问。见How to Ask
  • 好的,我添加了我的代码。抱歉,堆栈溢出的新手
  • 很高兴你已经添加了你的代码。现在描述一下你有什么问题。
  • value | range 这立即突出。 | 可以将位翻转到1,并且永远不能清除位到0

标签: c integer bitwise-operators function-definition


【解决方案1】:

函数可以看如下方式

#include <stdio.h>
#include <limits.h>

int reset_bits( int value, size_t position, size_t n ) 
{
    const size_t Width = CHAR_BIT * sizeof( int );

    if ( position < Width )
    {
        if ( Width - position < n ) n = Width - position;

        value &= ~( ~( ~0u << n )  << position );
    }

    return value;
}

int main(void) 
{
    int x = 0x8C3E;

    printf( "%#X -> %#X\n", ( unsigned int )x, ( unsigned int )reset_bits( x, 2, 3) );

    return 0;
}

程序输出是

0X8C3E -> 0X8C22

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    相关资源
    最近更新 更多