首页 > 其他分享 >C语言位运算

C语言位运算

时间:2024-08-28 22:16:23浏览次数:12  
标签:运算 二进制 0101 unsigned C语言 二进制位 按位

在 C 语言中,位运算是对二进制位进行的操作。以下是关于 C 语言位运算的介绍:

一、常见的位运算符

  1. 按位与(&):

    • 规则:两个对应的二进制位都为 1 时,结果位为 1,否则为 0。
    • 例如:5(二进制为 0101)与 3(二进制为 0011)进行按位与运算,结果为 0001,即 1。
  2. 按位或(|):

    • 规则:两个对应的二进制位只要有一个为 1 时,结果位为 1,否则为 0。
    • 例如:5(二进制为 0101)与 3(二进制为 0011)进行按位或运算,结果为 0111,即 7。
  3. 按位异或(^):

    • 规则:两个对应的二进制位不同时,结果位为 1,相同时为 0。
    • 例如:5(二进制为 0101)与 3(二进制为 0011)进行按位异或运算,结果为 0110,即 6。
  4. 取反(~):

    • 规则:将二进制位的每一位取反,即 0 变为 1,1 变为 0。
    • 例如:~5(二进制为 0101),结果为 1010,即按位取反后为 -6(在有符号整数中,最高位为 1 表示负数)。
  5. 左移(<<):

    • 规则:将一个数的二进制表示向左移动指定的位数,右边用 0 填充。
    • 例如:5(二进制为 0101)左移 2 位,结果为 20(二进制为 10100)。
  6. 右移(>>):

    • 规则:对于有符号数,将一个数的二进制表示向右移动指定的位数,左边用符号位填充;对于无符号数,左边用 0 填充。
    • 例如:5(二进制为 0101)右移 2 位,结果为 1(二进制为 0001)。

二、位运算的应用场景

  1. 高效的标志位处理:

    • 可以用一个整数的不同位来表示不同的标志状态。例如,可以用一个字节来表示 8 个不同的开关状态,通过位运算来设置、清除和检查这些标志位。
    • 代码示例:
      unsigned char flags = 0;
      // 设置第 3 个标志位
      flags |= (1 << 2);
      // 检查第 3 个标志位是否设置
      if (flags & (1 << 2)) {
          printf("Third flag is set.\n");
      }
      // 清除第 3 个标志位
      flags &= ~(1 << 2);
      
  2. 数据的压缩和编码:

    • 在某些情况下,可以通过位运算来压缩数据,减少存储空间的占用。例如,可以将多个小的整数打包到一个较大的整数中。
    • 代码示例:
      unsigned int packTwoNumbers(unsigned char num1, unsigned char num2) {
          return (num1 << 8) | num2;
      }
      
  3. 位掩码操作:

    • 可以使用位掩码来选择或屏蔽特定的位。例如,要获取一个整数的低 4 位,可以使用位掩码 0x0F。
    • 代码示例:
      unsigned int num = 0xABCD;
      unsigned char lowFourBits = num & 0x0F;
      
  4. 快速计算乘除 2 的幂次方:

    • 左移一位相当于乘以 2,右移一位相当于除以 2。
    • 代码示例:
      int num = 5;
      int doubled = num << 1; // 10
      int halved = num >> 1; // 2
      

总之,位运算在 C 语言中是一种强大的工具,可以用于优化代码、处理特定的数据格式和实现一些特定的算法。但在使用位运算时,需要小心处理边界情况和确保代码的可读性。

标签:运算,二进制,0101,unsigned,C语言,二进制位,按位
From: https://www.cnblogs.com/androidsuperman/p/18385613

相关文章

  • 【解析几何笔记】9. 向量的内积运算
    9.向量的内积运算定义:有向量α,β\pmb{\alpha},\pmb{\beta}α,......
  • 【C++基础】多种函数重载和运算符重载
    目录一、函数重载1.参数类型不同的重载讲解2.参数个数不同的重载讲解3.参数顺序不同的重载讲解4.默认参数与函数重载讲解二、运算符重载1.运算符重载的基本语法示例讲解函数内部的操作:运算符的使用:2.运算符重载的常见用法2.1重载<<和>>运算符(用于输......
  • 超详细!SQL运算符的操作练习-笔记-04章:运算符
    写在前面的话(•̀.̫•́)✧即将学习数据库系统的课程,此文为预习与自学,自学配套课程链接为:MySQL数据库入门到大牛,mysql安装到优化,百科全书级,全网天花板_哔哩哔哩_bilibili时间不够可以不看,前五章内容都比较简单,纯看笔记也能学会。本文主要内容是学习和练习运算符,这......
  • L1-039 古风排版——C语言
    中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。输入格式:输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。输出格式:按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足......
  • L1-032 Left-pad C语言
    根据新浪微博上的消息,有一位开发者不满NPM(NodePackageManager)的做法,收回了自己的开源代码,其中包括一个叫left-pad的模块,就是这个模块把javascript里面的React/Babel干瘫痪了。这是个什么样的模块?就是在字符串前填充一些东西到一定的长度。例如用*去填充字符串GPLT,使之长度为1......
  • 初识C语言指针(5)
    目录1.回调函数2.qsort函数2.1qsort函数的基本参数2.2qsort函数的使用2.3qsort排序结构体类型数据结语1.回调函数什么是回调函数呢?回调函数就是⼀个通过函数指针调⽤的函数。如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的......
  • c语言与素数相关的题目
    设计一个程序,输入N,输出0~N之间的所有素数先展示效果:代码如下#include<stdio.h>intmain(void){  inti,o,u,k=0;  printf("请输入一个整数");  scanf("%d",&i);  while(i>=2){    for(o=2;o<i;o++){    ......
  • C语言--运算符2
    目录位运算符1、&按位与2、|按位或3、~按位取反4、^按位异或5、位移(1)右移>>(2)左移<<位运算符例:128十进制转二进制正数在内存中以原码形式存放,负数在内存中以补码形式存放正数的原码=反码=补码原码:将一个整数,转换成二进制,就是其原码。如64的原码为:0100 00......
  • c语言中的管道函数
    在C语言中,管道是一种用于进程间通信的机制,它允许一个进程与另一个进程之间传递数据。以下是与管道相关的主要函数及其用法,包括pipe、popen、pclose和dup2函数。1.pipe函数pipe函数用于创建一个无名管道。无名管道是单向的,可以在父子进程之间传递数据。函数原型in......
  • Day09_0.1基础学习MATLAB学习小技巧总结(9)——数组运算
    利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍,为了在这个过程中加深印象,也为了能够有所足迹,我会把自己的学习总结发在专栏中,以便学习交流。素材来源“数学建模清风”特此说明:本博客的内容只在于总结在使用matlab中的一些小技巧,并非教程,若想系统的学习MATLAB,也可以移步......