当前位置:   article > 正文

C语言中对于二进制数据位清0和置1操作(普通变量+数组+指针)_c语言将数字部署为1

c语言将数字部署为1
一、基本知识
	(一)位bit运算符
			位与&运算符特点
			位或|运算符特点
	(二)移位运算符
	(三)位运算符和移位运算符结合(bit位清0与置1公式)
 二、例程
	 (一)清0与置1推导步骤
	 (二)借助数组将某一位清0和置1
	 (三)使用指针清0和 置1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

一、基本知识

(一)位(bit)运算符

1、功能:这些运算符就是专门操作内存中的二进制数

位与:&(目的:将二进制数的bit清0)
位或:|(目的:将二进制数的bit置1)
  • 1
  • 2

2、位与(&)运算符与 位或(|)运算符
(1)位与&运算符特点

语法:C = A & B
  • 1

规律:任何数跟0做位与,结果为0,任何数跟1做位与,保持原值
例如:

  数字    2进制     16进制
   A      01011010  0x5A
   B	  11100111  0xE7
   &--------------------
   C	  01000010  0x42
  • 1
  • 2
  • 3
  • 4
  • 5

(2)位或|运算符特点:
语法:C = A | B
规律:任何数跟1做位或,结果为1,任何数跟0做位或,保持原值
例如:

  数字    2进制     16进制
   A      01011010  0x5A
   B	  11100111  0xE7
   |--------------------
   C	  11111111  0xFF
  • 1
  • 2
  • 3
  • 4
  • 5

(二 )移位运算符
1、功能:将二进制数整体向左边或者向右边移动N个位置
分两种:

  左移:A<<B
  语义:将A左移B个位置
  右移:A>>B
  语义:将A右移B个位置
  • 1
  • 2
  • 3
  • 4

例如:

  char a = 0x5a; //a=0x5a=01011010
  char b = a << 2; //b=a<<2=0x5a<<2=01011010<<2 = 01101000 = 0x68 
  printf("a = %#x b = %#x\n", a, b); //a = 0x5a, b = 0x68
  
  b = a >> 2; //b = a >> 2 = 0x5a >> 2 = 01011010>>2=00010110 = 0x16
  printf("a = %#x b = %#x\n", a, b); //a = 0x5a b = 0x16
  
  a = 0xa5; //a = 0xa5 = 10100101
  b = a >> 2; //b = a >> 2 = 0xa5 >> 2 = 10100101>>2=11101001=0xE9
  printf("a = %#x b = %#x\n", a, b); //a = 0xa5 b = 0xe9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2、移位运算符特点

  1.向左移动后右边空出来的数据用0来填充
    0x5a << 2 = 01011010 << 2 = 01101000
  2.无符号类型数字右移时左边空出来的数据用0来填充
    unsigned char a = 0xa5; a >> 2 = 10100101 >> 2 = 00101001
  3.有符号类型数字右移时左边空出来的数据用符号位来填充
    char a = 0xa5; a >> 2 = 10100101 >> 2 = 11101001
  4.移位运算符不会修改变量本身的值
  5.只要将来有2的多少次方处理的代码,建议用移位操作
    例如:
    3*4; //垃圾代码,CPU运行*,/的效率极低
    3<<2; //高薪代码,CPU运行移位操作效率极高
    12/4; //不推荐
    12>>2; //推荐
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

(三)位运算符和移位运算符结合

1、实际开发常见的场景:位清0和位置1
2、给出以下位操作公式:

(1)清0公式:

1.将某个数据A的第n位清0,其它位保持不变:
		  A &= ~(0x1 << n); 
2.将某个数据A从第n位开始,连续两个bit位清0,其它位保持不变:
    A &= ~(0x3 << n);
3.将某个数据A从第n位开始,连续三个bit位清0,其它位保持不变:
    A &= ~(0x7 << n);
4.将某个数据A从第n位开始,连续四个bit位清0,其它位保持不变:
    A &= ~(0xF << n);
5.将某个数据A从第n位开始,连续五个bit位清0,其它位保持不变:
    A &= ~(0x1F << n);
6.将某个数据A从第n位开始,连续六个bit位清0,其它位保持不变:
    A &= ~(0x3F << n);
7.将某个数据A从第n位开始,连续七个bit位清0,其它位保持不变:
    A &= ~(0x7F << n);
8.将某个数据A从第n位开始,连续八个bit位清0,其它位保持不变:
    A &= ~(0xFF << n);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

(2)置1公式:

  1.将某个数据A的第n位置1,其它位保持不变:
    A |= (0x1 << n); 
  2.将某个数据A从第n位开始,连续两个bit位置1,其它位保持不变:
    A |= (0x3 << n);
  3.将某个数据A从第n位开始,连续三个bit位置1,其它位保持不变:
    A |= (0x7 << n);
  4.将某个数据A从第n位开始,连续四个bit位置1,其它位保持不变:
    A |= (0xF << n);
  5.将某个数据A从第n位开始,连续五个bit位置1,其它位保持不变:
    A |= (0x1F << n);
  6.将某个数据A从第n位开始,连续六个bit位置1,其它位保持不变:
    A |= (0x3F << n);
  7.将某个数据A从第n位开始,连续七个bit位置1,其它位保持不变:
    A |= (0x7F << n);
  8.将某个数据A从第n位开始,连续八个bit位置1,其它位保持不变:
    A |= (0xFF << n);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

二、例程

(一)清0与置1推导步骤
1-1、清零
在这里插入图片描述
代码截图如下:
在这里插入图片描述
1-2、清零
在这里插入图片描述
代码截图如下
在这里插入图片描述
在这里插入图片描述
2-1、置1
在这里插入图片描述
(二)、借助 数组将某一位清零和置一
在这里插入图片描述
在这里插入图片描述

(三)、使用指针清零和 置1

在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/112262
推荐阅读
相关标签
  

闽ICP备14008679号