精华内容
下载资源
问答
  • C语言位运算

    2015-06-08 09:29:22
    C语言位运算,ppt,可以用来教学和学习,内容充实,可靠,有助于C语言的学习。
  • 主要以图文结合的方式为大家详细介绍了C语言位运算基础知识,感兴趣的小伙伴们可以参考一下
  • C语言位运算 有6种: &, | , ^(亦或), <<(左移), >>(右移)。 注意:参与位运算的元素必须是int型或者char型,以补码形式出现。 按与& &运算常应用于: 迅速清零 保留指定位 判断奇偶性 a & 1 = 1...
  • C语言 位运算加法

    2020-04-16 21:25:42
    学习了位运算后总想着怎么把它用在程序中,奈何知识量有限,在这里便写一个位运算实现两数之和的功能》 首先我们得先链接位运算的三个基本操作符: & 按与—(有0为0,双11 ) I 按或—(有1为1,...

    学习了位运算后总想着怎么把它用在程序中,奈何知识量有限,在这里便写一个位运算实现两数之和的功能》
    首先我们得先了解位运算的三个基本操作符:

    &按位与—(有0为0,双1位1 )
    I按位或—(有1为1,双0为0)
    ^按位异或—(不同为1,相同为0)

    接下来我们想要用位运算解决两数之和,得先知道他们的二进制形式。
    例如:2+3=5

    20010
    30011
    50101

    不难看出第二位发生了进位,那么我们怎么用符号实现呢:

    (2 & 3)<<1(0010 & 0011)<<1 = 0100
    2^30010 ^0011 = 0001
    50100^0001 = 0101

    虽然上述看似成立了,但是运算起来仍然有问题,这里仅仅考虑到了单次进位,假设有多次进位那么这个等式便不成立。
    而很自然的想到连续进位那么就会联想到循环,下面这个代码便用了循环实现多次进位:

    #include <stdio.h>
    int main()
    {
     int x, y;
     scanf_s("%d %d", &x, &y);
     
     while (x & y)//一但x&y为真就代表,存在要进位
     {
     int m = x,n = y;
     x = m^n;
     y=(m & n)<<1;
     }
      printf("%d + %d = %d\n", x, y, x ^ y);
    return 0;
    
    }
    
    

    上述代码中的while的条件很好的让所有的进位都能进行。

    展开全文
  •  C语言中提供了一些运算符可以直接操作整数的,称为位运算,因此位运算中的操作数都必须是整型的。位运算的效率是比较高的,而且位运算运用好的话会达到意想不到的效果。位运算主要有6种:与(&),或(|),取反(~)...
  • 所谓位运算,就是对一个比特(Bit)进行操作。在《二进制思想以及数据的存储》一节中讲到,比特(Bit)是一个电子元器件,8个比特构成一个字节(Byte),它已经是粒度最小的可操作单元了。 C语言提供了六种...
  • C语言位运算应用实例

    千次阅读 多人点赞 2018-09-21 04:22:20
    这里写自定义目录标题C语言位运算应用实例一、操作规则1、与运算 (&amp;amp;amp;)2、或运算 (|) C语言位运算应用实例 正在准备2019年RM比赛,遇到这样一个场景:Tx2图像采集之后要把目标位置传给stm32...

    C语言位运算应用实例

    正在准备2019年RM比赛,遇到这样一个场景:Tx2图像采集之后要把目标位置传给stm32控制板,位置信息有x/y这一属性,准备用串口做数据传输。

    传输数据范围是[0,560]且为整数,但是查了一下发现stm32的串口一次最多读8位数据,也就是[0,255],没有办法,只能把数据拆成两个8位的来传输。

    下面根据一应用实例总结C语言中位运算使用。


    一、位操作规则

    共有6种位操作

    运算符含义
    &按位与运算
    i按位或运算
    ^按位异或运算
    ~按位取反运算
    <<左移
    >>右移
    • 按位运算:指把参与运算的两个数据都换位二进制后,每两个对应位进行运算并得到新二进制数*
    • 若把存储运算结果的变量设为unsigned类型,则所有位都是数据位;否则以补码形式换算为带符号十进制数。
    • 以下都是以unsigned型为例

    1、与 (&)

    运算结果
    0 & 00
    0 & 10
    1 & 00
    1 & 11

    规则:有0为0,全1为1

    1、实例:

    • 3&5 = 011 & 101 = 001=1

    2、常用用法:

    • 对某些位清零。如要对3:0位清零,只需将数据与1111 0000 &运算即可
    • 取数据中某些位。如取0110 0110中2:1位,(0110 0110 & 0000 0110>>1=11=3

    2、或 (|)

    运算结果
    00
    01
    10
    11

    规则:有1为1,全0为0

    1、实例:

    • 3|5 = 011 | 101 = 111=7

    2、常用用法:

    • 对某些位赋值。如给0111 0000的3:0位赋1111:0111 0000|0000 1111 =0111 1111

    3、与或 (^)

    运算结果
    0 ^ 00
    0 ^ 11
    1 ^ 01
    1 ^ 10

    规则:相同为0,不同为1

    1、实例:

    • 3^5 = 011 ^ 101 = 110 = 6

    2、常用用法:

    • 使特定位翻转。将要翻转的位与1异或运算,如翻转1010的1:0位:1010^0011=1001

    4、取反 (~)

    运算结果
    ~01
    ~10

    规则:1变0,0变1

    1、实例:

    • ~3 = ~011 = 100 = 4

    2、常用用法:

    • 使全部位翻转

    5、左移、右移(<< 、>>)

    运算结果
    a<<n把数据a左移n位(换成二进制形式移),溢出部分舍去,末尾补0
    a>>n把数据a右移n位(换成二进制形式移),移出末位部分舍去,高位补0

    1、实例:

    • 3<<2 = 011<<2 = 01100 = 12
    • 3>>2 = 011>>2 = 0 = 0

    2、常用用法:

    • 配合&运算把取出的位移到最低。
    • a<<n == a*2^n
    • a>>n == a/2^n

    二、位操作应用实例

    要处理文章开头提出的实际问题,设计数据传输格式为:

    • 每帧数据长8位,且表示正整数(unsigned char型)
    • 每两帧数据拼一个真实数据,最多表示12位 ( [0,4095] )
    含义
    7指示x,y属性(1-x 0-y)
    6指示拼数据时高低属性(1-高 0-低)
    5:0数据

    1、编码

    思路:分别取数据 5:0 和 11:6 位域,根据数据属性补充最高两位数据。实例如下:

    #include <iostream>
    using namespace std;
    
    #define DATA 1200 //待编码数据
    #define Low 0     //用于补齐高位信息
    #define High 1
    #define X_ctrl 1
    #define Y_ctrl 0
    
    unsigned char set_flag_bit(unsigned char data,int X_Y,int H_L) //填高2位
    {
    	data &= 0X3F;  //高2位清零 0x3F=0011 1111 
    	
    	if(X_Y==Y_ctrl && H_L==Low)		//Y-L 00
    		data |= 0X00;				//0x00=0000 0000
    	
    	else if(X_Y==X_ctrl && H_L==Low)	//X-L 10
    		data |= 0X80;				//0x80=1000 0000
    
    	else if(X_Y==Y_ctrl && H_L==High)	//Y-H 01
    		data |= 0X40;				//0x40=0100 0000
    
    	else if(X_Y==X_ctrl && H_L==High)	//X-H 11
    		data |= 0XC0;				//0xC0=1100 0000
    		
    	return data;	
    }
    
    unsigned char Ldata,Hdata;
    void data_processing(int data,int X_Y)
    {
    	Ldata=data & 0XFF;//取低8(1-8)位 0xFF = 1111 1111 
    	Ldata=set_flag_bit(Ldata,X_Y,Low);
    	
    	Hdata=(data & 0X3FC0)>>6;//取高7-14位 0xFF = 1111 1111 0000 0000
    	Hdata=set_flag_bit(Hdata,X_Y,High);
    }
    
    int main()
    {
    	int data = DATA; 
    	data_processing(DATA,Y_ctrl);
    	
    //	cout<<hex;	//选择是否以16进制输出
    	cout<<(unsigned int)Hdata<<" "<<(unsigned int)Ldata<<endl;
    	return 0;
    } 
    

    2、解码

    思路:先取数据高二位判断属性,根据其信息拼接数据并存入x、y数据buff中。实例如下:

    #include<iostream>
    using namespace std;
    
    unsigned int x_real_data_buff[10];//存储x、y数据的buff,用于滑动平均滤波
    unsigned int y_real_data_buff[10];
    int x_real_data_cnt=0;//buff中数据个数计数
    int y_real_data_cnt=0;
    
    unsigned char data_decode(unsigned char data)
    {
    	unsigned int real_data;
    	
    	static int x_cnt=0;     
    	static int y_cnt=0;     
    	static unsigned char Hdata;				
    	static unsigned char Ldata;				
    	static unsigned char update_flag=0;//标记是否已收到高段数据(是-1,不是-0)
    	static float x_aver=0;
    	static float y_aver=0;	
    	
    	unsigned char X_Y_decide;          //1->X
    	unsigned char H_L_decide;          //1->H
    	
    	switch((data & 0xc0)>>6)//0xc0=1100 0000,这里取高2位
    	{
    		case 0x00:				//00 
    			X_Y_decide=0;
    			H_L_decide=0;
    			Ldata=(data & 0X3F);//0X3F=0011 1111,这里取出该数据帧中有效数据部分
    			break;
    		
    		case 0x01:        //01
    			X_Y_decide=0;
    			H_L_decide=1,update_flag=1;
    			Hdata=(data & 0X3F);
    			break;
    		
    		case 0x02:        //10
    			X_Y_decide=1;
    			H_L_decide=0;
    			Ldata=(data & 0X3F);
    			break;
    		
    		case 0x03:        //11
    			X_Y_decide=1;
    			H_L_decide=1,update_flag=1;
    			Hdata=(data & 0X3F);
    			break;	
    	}
    	
    	if(update_flag==1 && H_L_decide==0//已收到高位,又收到低位,一个数据接收完成
    	{
    		update_flag=0;
    		real_data=Hdata;//这里直接左移会溢出丢数据,所以应先给16位的real_data再左移
    		real_data=(real_data<<6) | Ldata;	
    		
    		if(X_Y_decide==1)
    			x_real_data_buff[x_real_data_cnt++]=real_data;
    		else 
    			y_real_data_buff[y_real_data_cnt++]=real_data;
    	}
    	
    }
    
    void show_data(unsigned int *buff,int CNT)
    {
    	for(int i=0;i<CNT;i++)
    		cout<<buff[i]<<" ";
    	cout<<endl;
    }
    
    int main()
    {
    	unsigned char data_buff[]={0x52,0x30,0xd2,0xb0};//待解码数据写在这里
    	for(int i=0;i<sizeof(data_buff)/sizeof(data_buff[0]);i++)
    		data_decode(data_buff[i]);
    	
    	cout<<"x_data:";
    	show_data(x_real_data_buff,x_real_data_cnt);
    	
    	cout<<"y_data:";
    	show_data(y_real_data_buff,y_real_data_cnt);
    	
    	return 0;
    } 
    
    • 经测试,上述代码可以稳定实现自定义数据协议的编码解码工作。
    • 抗传输丢包效果良好,除非恰好连续丢 “此数据低段” 和“下一数据高段” ,否则不会读取到错误信息。
    展开全文
  • C语言位运算练习题1 C语言位运算练习题 一选择题 1以下程序的功能是进行位运算 ?main) ?{ unsigned char? a, b; ? a=7^3? b= ~4 & 3? printf%d %d ,a,b; ?} 程序运行后的输出结果是 A4? 3? B7? 3? C7? 0? D4? 0 2有...
  • C语言位运算实现加法减法

    千次阅读 2020-03-24 17:37:01
    编写C语言程序,实现基于位运算的加减法器。要求: (1)源操作数和目的操作数均为int类型; (2)除循环控制变量外,加减运算过程中,不得使用C语言的“+”和“-”运算符; (3)控制信号M=0,做加法;M=1,做减法...

    编写C语言程序,实现基于位运算的加减法器。要求:

    (1)源操作数和目的操作数均为int类型;

    (2)除循环控制变量外,加减运算过程中,不得使用C语言的“+”和“-”运算符;

    (3)控制信号M=0,做加法;M=1,做减法;

    (4)运算结果包括和/差、溢出判别标志V,v=1为溢出,v=0为未溢出;

    题目设定即为只能使用位运算,代码具体如下:

    #include<stdio.h>
    #include<stdlib.h>
    void main()
    {
    	int s,d,s1,d1,m,r=0,v,i,cin,cout;
    	printf("请输入源操作数:");
    	scanf("%d",&s);
    	printf("请输入目的操作数:");
    	scanf("%d",&d);
    	printf("请输入控制信号M:");//0为加法,1为减法
    	scanf("%d",&m);
    	cout=m&0x00000001;   
    	cin=cout;
    	for(i=0;i<=31;i++)
    	{
    		v=cout;
    		s1=(s&(1<<i))>>i;
    		d1=(d&(1<<i))>>i^m;   
    		//逐位提取
    		r|=((s1^d1^cin)<<i);     
    		//按位获取结果
    		cout=((s1&d1)|((s1^d1)&cin));  
    		//进位信号
    		cin=cout;   
    		//下一位cin等于上一位cout
    	}
    	v=(v^cout)&0x00000001;   
    	//最后一位进位信号为溢出信号
    	printf("运算结果为%d,溢出情况为%d\n",r,v);	
    }
    

    调试结果正确
    在这里插入图片描述
    解决了您的问题请给一个免费的赞哦~

    展开全文
  • C语言位运算详解

    万次阅读 多人点赞 2017-12-14 17:24:24
     位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制的问题。 C 语言提供了 6 个操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的 char,short,int 与 long 类型。 C ...

     位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,intlong类型。
    C语言提供的位运算符列表:
    运算符含义描述
    按位与      如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
    按位或      两个相应的二进制位中只要有一个为1,该位的结果值为1
    按位异或    若参加运算的两个二进制位值相同则为0,否则为1
    取反        ~是一元运算符,用来对一个二进制数按位取反,即将01,将10
    << 左移       用来将一个数的各二进制位全部左移N位,右补0
    >> 右移       将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,                 高位补0

    1按位与运算符(&

        按位与是指:参加运算的两个数据,按二进制位进行运算。如果两个相应的二进制位都为1,

    则该位的结果值为1;否则为0。这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。按位与其

    实与逻辑上的运算规则一致。逻辑上的,要求运算数全真,结果才为真。若,

    A=true,B=true,AB=true 例如:3&5 3的二进制编码是11(2)。(为了区分十进制和其他进制,本文规

    定,凡是非十进制的数据均在数据后面加上括号,括号中注明其进制,二进制则标记为2)内存储存数据

    的基本单位是字节(Byte),一个字节由8个位(bit)所组成。位是用以描述电脑数据量的最小单位。二

    进制系统中,每个01就是一个位。将112)补足成一个字节,则是000000112)。5的二进制编码是

    1012),将其补足成一个字节,则是000001012
    按位与运算:
     00000011(2)
    &00000101(2)
     00000001(2)
    由此可知3&5=1
    c语言代码:
    #include <stdio.h>
    main()
    {
     int a=3;
     int 5;
     printf("%d",a&b);
    }
    按位与的用途:
    1)清零
    若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件:

    原来的数中为1的位,新数中相应位为0。然后使二者进行&运算,即可达到清零目的。
    例:原数为43,即001010112),另找一个数,设它为148,即100101002),将两者按位与运算:
     001010112
    &100101002
     000000002
    c语言源代码:
    #include <stdio.h>
    main()
    {
     int a=43;
     int 148;
     printf("%d",a&b);
    }
    2)取一个数中某些指定位
    若有一个整数a(2byte),想要取其中的低字节,只需要将a81按位与即可。
    00101100 10101100
    00000000 11111111
    00000000 10101100
    3)保留指定位:
    与一个数进行按位与运算,此数在该位取1.
    例如:有一数84,即010101002),想把其中从左边算起的第34578位保留下来,运算如下:
     01010100(2)
    &00111011(2)
     00010000(2)
    即:a=84,b=59
        c=a&b=16
    c语言源代码:
    #include <stdio.h>
    main()
    {
     int a=84;
     int 59;
     printf("%d",a&b);
    }

    2按位或运算符(|
    两个相应的二进制位中只要有一个为1,该位的结果值为1。借用逻辑学中或运算的话来说就是,一真为真


    例如:608|178,将八进制60与八进制17进行按位或运算。
     00110000
    |00001111
     00111111
    c语言源代码:
    #include <stdio.h>
    main()
    {
     int a=060;
     int 017;
     printf("%d",a|b);
    }
    应用:按位或运算常用来对一个数据的某些位定值为1。例如:如果想使一个数a的低4位改为1,则只需要

    a178)进行按位或运算即可。

    3异或运算符(^
    他的规则是:若参加运算的两个二进制位值相同则为0,否则为1
    00=001=110=1, 11=0
        例:   00111001
            ∧ 00101010
               00010011
    c语言源代码:
    #include <stdio.h>
    main()
    {
     int a=071;
     int 052;
     printf("%d",a^b);
    }
    应用:
    1)使特定位翻转
    设有数011110102),想使其低4位翻转,即1001.可以将其与000011112)进行异或运算,

    即:
     01111010
    ^00001111
     01110101
    运算结果的低4位正好是原数低4位的翻转。可见,要使哪几位翻转就将与其进行运算的该几位置为1

    即可。
    ()0异或,保留原值
    例如:012^00=012
            00001010
           ^00000000
            00001010
    因为原数中的10进行异或运算得10^00,故保留原数。
    (交换两个值,不用临时变量
    例如:a=3,即112);b=4,即1002)。
    想将a和b的值互换,可以用以下赋值语句实现:
        a=ab;
        b=ba;
        a=ab;
    a=011(2)
        )b=100(2)
    a=111(2)ab的结果,a已变成7)
        )b=100(2)
    b=011(2)ba的结果,b已变成3)
        )a=111(2)


    a=1002)(ab的结果,a已变成4)
    等效于以下两步:
        ① 执行前两个赋值语句:a=ab;b=ba;相当于b=b(ab)
        ② 再执行第三个赋值语句: a=ab。由于a的值等于(ab),b的值等于(bb),

    因此,相当于a=b,即a的值等于ab,等于b。
    很神奇吧!
    c语言源代码:
    #include <stdio.h>
    main()
    {
     int a=3;
     int 4;
     a=a^b;
     b=b^a;
     a=a^b;
     printf("a=%d b=%d",a,b);
    }

    4取反运算符(~
    他是一元运算符,用于求整数的二进制反码,即分别将操作数各二进制位上的1变为00变为1
    例如:~77(8)
    源代码:
    #include <stdio.h>
    main()
    {
     int a=077;
     printf("%d",~a);
    }

    5、左移运算符(<<
    左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负

    值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。
    例如:将a的二进制数左移2位,右边空出的位补0,左边溢出的位舍弃。若a=15,000011112),左移2

    位得001111002)。
    源代码:
    #include <stdio.h>
    main()
    {
     int a=15;
     printf("%d",a<<2);
    }
    左移1位相当于该数乘以2,左移2位相当于该数乘以2*24,15<<2=60,即乘了4。但此结论只适用于该

    数左移时被溢出舍弃的高位中不包含1的情况。
        假设以一个字节(8位)存一个整数,若a为无符号整型变量,则a=64时,左移一位时溢出的是0

    ,而左移2位时,溢出的高位中包含1

    6、右移运算符(>>
    右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负

    值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,某些机器将对左边空出的部分

    用符号位填补(即算术移位),而另一些机器则对左边空出的部分用0填补(即逻辑移位)。注

    意:对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移

    0。如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的

    系统移入1。移入0的称为逻辑移位,即简单移位;移入1的称为算术移位
    例: a的值是八进制数113755
       a:1001011111101101 (用二进制形式表示)
       a>>1: 0100101111110110 (逻辑右移时)
       a>>1: 1100101111110110 (算术右移时)
       在有些系统中,a>>1得八进制数045766,而在另一些系统上可能得到的是145766Turbo C和其他一些C

    编译采用的是算术右移,即对有符号数右移时,如果符号位原来为1,左面移入高位的是1
    源代码:
    #include <stdio.h>
    main()
    {
     int a=0113755;
     printf("%d",a>>1);
    }

    7、位运算赋值运算符

    位运算符与赋值运算符可以组成复合赋值运算符。
       例如&=, |=, >>=, <<=, =
       例:  b相当于 b
             << =2相当于<< 2


    展开全文
  • C语言与C++的不同, 关键在于位运算和宏操作, 可以通过位移(<
  • C语言位运算技巧总结

    2013-04-14 10:47:27
    这是C语言相关的位运算技巧的总结文档资料,对巩固C语言位运算的知识大有裨益。
  • c语言位运算的妙用-程序优化

    千次阅读 多人点赞 2019-03-01 20:44:18
    在需要大量运算是,位运算能节省时间,提高oj的通过率。 四个妙用: 1.判断整型变量奇偶 使用运算符:&amp; 原理: 2的0次是1,2的1次是2。根据按权展开可知,只需判断最后一即可。1的二进制是000......
  • 首先,在了解位运算取反之前,我们要先了解在内存中数据是怎么存储的。 在计算机系统中,数值一律用补码来表示和存储。 什么是补码呢? 正整数的补码:是其二进制表示,与原码相同。eg:假设int 型变量为2字节,int ...
  • C语言位运算.pdf

    2021-09-27 12:52:09
    C语言位运算.pdf
  • C语言位运算之异或

    千次阅读 2019-01-24 20:24:10
    运算符在任何一门编程语言中都占有不可磨灭的地位,今天我则要说一个运算符中的位运算中的异或,因为它不比其他运算符,也容易被我们忽视,但有时候他的作用还是蛮大的,下面我则以一道习题来和大家讨论一下异或这个...
  • 12-C语言位运算.ppt

    2021-07-24 20:53:57
    12-C语言位运算.ppt
  • c语言位运算

    2013-06-03 22:30:12
    C语言位运算的部分内容,希望可以帮助到大家
  • C语言位运算中鲜为人知的事.pdf
  • c语言位运算有什么作用

    千次阅读 2017-08-26 10:09:53
    运算符 运算符作用于,并逐执行操作。&、 | 和 ^ 的真值表如下所示: p q p & q p | q p ^ q 0 0 0 0 0 0 1 0 1 1 1 1 1 1...
  • C语言位运算PPT课件.pptx
  • C语言 位运算PPT课件.pptx
  • c语言位运算[借鉴].pdf

    2021-10-11 01:37:37
    c语言位运算[借鉴].pdf
  • C语言位运算PPT学习教案.pptx

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 183,686
精华内容 73,474
关键字:

c语言位运算

c语言 订阅