《C语言笔记:位操作相关》

一,位操作一般用法

  1,特定位清零用“&”。

    要想把一个数的特定位清零,就需要构造另一个数,这个数的对应特定位为0,其他位为1。2

  2,特定位置1用“|”。

    要想把一个数的特定位置1(设置特定位),就需要构造另一个数,这个数的对应特定位为1,其他位为0。

  3,特定位取反用“^”。

    要想把一个数的特定位取反,就需要构造另一个数,这个数的对应特定位为1,其他位为0。

二,如何构造“另一个数”。

  1,如果这个数比较少位为“1”,大部分为“0”,则可以通过连续多“1”左移n位得到。

  2,如果这个数比较少位为“0”,大部分为“1”,则可以先通过构建其位反数,然后再位取反来得到。

  3,如果想要构造的数中连续1(连续0)的部分不止一个,那么可以通过多段分别构造,然后再彼此位或即可。

三,位运算实战。

  1,给定一个整数型a,设置a的bit3,同时保证其他位不变。

    a |= (0x1<<3);

  2,给定一个整数型a,设置a的bit3~bit7,同时保证其他位不变。

    a |= (0x1f<<3);

  3,给定一个整数型a,清除a的bit15,同时保证其他位不变。

    a &= (~(0x1<<15));

  4,给定一个整数型a,清除a的bit15~bit23,同时保证其他位不变。

    a &= (~(0x1ff<<15));

  5,给出一个整数型a,取出bit3~bit8。

    第一步:先把bit3~bit8保持不变,其他位清零。

        a &= ((0x3f<<3)) ;

    第二步:再将其右移3位得到结果。

        a>>3;

  6,给一个寄存器的bit7~bit17赋值937(其他位不受影响)。

    关键点:第一,不能影响其他位,第二,并不知道bit7-bit17中原来的值。

    第一步:对于关键点二,得先把bit7~bit17清零。

      a &= (~(0x7ff<<7));

    第二步:将937写到对应位。

      a |= (937<<7);

  7,将一个寄存器的bit7~bit17的值加17(其他位不受影响)。

    第一步:先读出对应位的数。

      data = (a & (0x7ff<<7))>>7;

    第二步:data  += 17;

    第三步:对应位清零。

      a &= (~(0x7ff<<7));

    第四步: a |= (data<<7);

  8,给一个寄存器的bit7~bit17赋值937,给一个寄存器的bit21~bit25赋值17(其他位不受影响)。

    两次第6题。

    a &= (~(0x7ff<<7) | ~(0x1f<<21));

    a |= ((937<<7) | (17<<21))

  9,宏实现置位,复位。(一般笔试题中规定的是最右边为第一位)

    #define SET_BIT(x,n)  (x|((1U)<<(n-1)))

    #define CLEAR_BIT(x,n) ((x & ~((1U)<<(n-1))))

  10,截取变量的部分连续位。比如变量0x88,即0x10001000b,若截取第2~4位,则值为100b = 4。

    #define GETBITS(x,n,m) ((x & ~(~(0U)<<(m-n+1))<<(n-1))>>(n-1))

    分析:

      #define GETBITS(x,n,m)   ((x    &    ~(~(0U)<<(m-n+1))   <<(n-1))   >>(n-1))

      第一次分解:

        (x & ~(~(0U)<<(m-n+1)) <<(n-1))                    >>         (n-1))

      第二次分解:

        x                              &                                        ~(~(0U)<<(m-n+1)) <<(n-1)

      第三次分解:

         ~(~(0U)<<(m-n+1))                                        <<         (n-1)

       ~(~(0U)<<(m-n+1)):得到连续(m-n+1)个1的数 。

      ~(~(0U)<<(m-n+1)) << (n-1):将连续(m-n+1)个1的数 移动到对应连续位处。

      (x & ~(~(0U)<<(m-n+1)) <<(n-1)):取出对应位处的位值。

      (x & ~(~(0U)<<(m-n+1)) <<(n-1)) >> (n-1)):得到所求连续位的值。

#include <stdio.h>

#define GETBITS(x,n,m)    ((x&(~(~(0u)<<(m-n+1))<<(n-1)))>>(n-1))
#define CLEARBITS(x,n,m)   (x&(~((~(~(0u)<<(m-n+1)))<<(n-1))))
#define SETBITS(x,n,m)    (x|(~(~(0u)<<(m-n+1)))<<(n-1))

int main()
{
    int a = 0x88;

    printf("  %d  \n",GETBITS(a,2,4));    //4

    a = 0xff;
    
    printf(" 0x%x  \n ",CLEARBITS(a,2,4));  // 0xf1

    a = 0xf1;
    
    printf(" 0x%x  \n",SETBITS(a,2,4));     //0xff
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 闫学灿老师的蓝桥杯C语言课程笔记是一份非常实用和全面的学习资料。在这份笔记中,他以蓝桥杯C语言竞赛为出发点,系统地介绍了C语言的基本知识、编程技巧和解题思路。 首先,这份笔记对C语言的基础知识进行了详细的讲解。从数据类型、运算符、控制结构、数组到函数,每个知识点都有清晰的定义和示例。这使得初学者能够迅速上手,了解C语言的基本特性和语法规则。 其次,笔记中还涉及了各种常用的C语言编程技巧。比如,如何进行输入输出、如何进行字符串处理、如何进行文件操作等等。这些技巧是实际编程中经常用到的,通过学习这些技巧,可以提高编程效率和代码质量。 另外,在笔记的后半部分,闫学灿老师还分享了他在蓝桥杯C语言竞赛中的解题思路和经验。这对于想要参加蓝桥杯的学生来说,无疑是非常有价值的。他详细讲解了一些比较经典的题目,以及如何从题目中找到思路和解决方案。 总的来说,闫学灿老师的蓝桥杯C语言课程笔记是一份非常实用和全面的学习资料。不仅适合蓝桥杯竞赛的学生,也适合其他对C语言感兴趣的学习者。通过学习这份笔记,可以提高自己的C语言编程能力,并为今后的编程学习和工作打下坚实的基础。 ### 回答2: 闫学灿是一位知名的编程教育家,他在蓝桥杯和C语言方面有着丰富的教学经验和深厚的专业知识。他的课程笔记以蓝桥杯C语言题目为主线,介绍了C语言的基础知识、高级应用以及解题技巧等内容。 在蓝桥杯C语言竞赛中,学生们通常需要使用C语言编写程序来解决一系列问题。闫学灿的课程笔记通过对大量题目的剖析和解析,帮助学生理解问题的本质,掌握解题的思路和方法。他的讲解通俗易懂,注重实例演示,让学生能够更好地理解和掌握。 课程笔记中,闫学灿详细介绍了C语言的基础语法、控制结构、数组、指针等重要知识点,并通过大量编程实例来巩固学生的学习成果。他注重培养学生的实际动手能力,通过编程实践来提高学生的编程水平和解题能力。 此外,闫学灿的课程笔记还包括了一些高级应用,如字符串处理、递归、动态内存分配等,以及一些重要的算法和数据结构,如排序、查找等。通过这些内容的学习,学生可以更全面地掌握C语言的使用和应用。 总的来说,闫学灿的蓝桥杯C语言课程笔记全面系统地介绍了C语言的基础知识和应用技巧,通过丰富的编程实例和解题思路的讲解,帮助学生在蓝桥杯竞赛中取得更好的成绩,并提高他们的编程水平和解决问题的能力。这样的课程材料对于C语言爱好者和想要参加蓝桥杯竞赛的学生来说都是非常有价值的参考资料。 ### 回答3: 蓝桥杯C语言是由蓝桥杯组织举办的一项程序设计竞赛。参赛者需要使用C语言编写程序解决一系列算法和编程题目。 闫学灿(Y总)是一位知名程序员,他开设了一系列C语言课程笔记,内容丰富全面,对于初学者和有一定基础的编程爱好者都非常有帮助。 在闫学灿的C语言课程笔记中,他详细讲解了C语言的基础知识,包括变量、数据类型、运算符、流程控制等等。他还介绍了C语言的一些特性和编程技巧,例如指针、结构体、文件操作等。通过学习这些内容,可以帮助我们更好地理解和运用C语言。 闫学灿的C语言课程笔记还包含了许多实例和练习题,通过实践的方式帮助我们巩固所学的知识。他还提供了一些实际项目的源码和解决方案,让我们可以实际操作和应用所学的知识。 总的来说,蓝桥杯C语言闫学灿(Y总课程笔记)是一门非常优秀的课程,对于想要学习C语言并参加蓝桥杯竞赛的学生来说是很好的学习资料。通过学习这门课程,我们可以系统地学习和掌握C语言的知识,并通过实践提高我们的编程能力和解决问题的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程界的小学生、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值