㈠ 在单片机c语言中如何对变量的某一位进行操作或赋值。
在C语言中,一般有两种方法来操作位,一种是使用C语言提供的位运算操作符,一种是使用位域。
1、使用位域
在C语言中定义位域的一般格式如下:
struct位域结构名
{位域列表};
struct:在C语言中定义位域所使用的关键字是struct。
位域结构名:是一个C语言中的标识符,有字母、数字、下划线组成,而且第一个字符必须是字母或者下划线。
位域列表:组其中位域列表的形式为: 类型说明符 位域名:位域长度
下面的示例代码,通过位域来计算IEEE754浮点数编码中单精度数的最大值 、最小值和最小弱规范数。
#include<stdio.h>
typedefstructFP_SINGLE
{
unsigned__int32fraction:23;
unsigned__int32exp:8;
unsigned__int32sign:1;
}fp_single;
intmain()
{
floatx;
fp_single*fp_s=(fp_single*)&x;
fp_s->sign=0;
fp_s->exp=0xfe;
fp_s->fraction=0x7fffff;
printf("float最大数:%le ",(double)x);
fp_s->sign=0;
fp_s->exp=0x1;
fp_s->fraction=0x0;
printf("float最小数:%le ",(double)x);
fp_s->sign=0;
fp_s->exp=0;
fp_s->fraction=0x1;
printf("float最小弱规范数:%le ",(double)x);
return0;
}
2、使用位运算符
C语言中的位运算符有一个基本的常识,即只能操作整数,不能操作浮点数,因为浮点数是使用IEEE754编码的,使用位操作数没有任何意义。
C语言提供的位运算符列表:
&按位与如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
|按位或两个相应的二进制位中只要有一个为1,该位的结果值为1
^按位异或若参加运算的两个二进制位值相同则为0,否则为1
~取反~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<<左移用来将一个数的各二进制位全部左移N位,右补0
>>右移将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0
㈡ c语言中复合位运算赋值(&=,|=,^=,>>=,<<=)表示什么意思
&=,按位与后赋值,变量&=表达式;
|=,按位或后赋值,变量|=表达式;
^=,按位异或后赋值,变量^=表达式;
>>=,右移后赋值,变量>>=表达式;
<<=,左移后赋值,变量<<=表达式;
类似的还有,
/=,除后赋值,变量/=表达式;
*=,乘后赋值,变量*=表达式;
%=,取模后赋值,变量%=表达式;
+=,加后赋值变量,+=表达式;
-=,减后赋值变量,-=表达式;
这些是C/C++独有的复合赋值运算符,结合方向,从右向左。是一种缩写形式,使得对变量的改变更为简洁,更有效率。
㈢ c语言,位符合赋值运算符, <<=,>>=,&=,^=,!=, 分别什么含义啊
1.=
赋值运算符
变量=表达式
如:a=3;将a的值赋为3
2./=
除后赋值
变量/=表达式
如:a/=3;即a=a/3
3.*=
乘后赋值
变量*=表达式
如:a*=3;即a=a*3
4.%=
取模后赋值
变量%=表达式
如:a%=3;即a=a%3
5.+=
加后赋值
变量+=表达式
如:a+=3;即a=a+3
6.-=
减后赋值
变量-=表达式
如:a-=3;即a=a-3
7.<<=
左移后赋值
变量<<=表达式
左移就是将《左边的数的二进制各位全部左移若干位,《右边的数指定移动位数,高位丢弃,低位补0,
移几位就相当于乘以2的几次方
8.>>=
右移后赋值
变量>>=表达式
右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。注意:对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0。如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的
系统移入1。移入0的称为“逻辑移位”,即简单移位;移入1的称为“算术移位”。
9.&=
按位与后赋值
变量&=表达式
按位与是指:参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。按位与其实与逻辑上“与”的运算规则一致。逻辑上的“与”,要求运算数全真,结果才为真。若,A=true,B=true,则A∩B=true
10.
^=
按位异或后赋值
变量^=表达式
参与运算的两个量按照对应的位进行异或运算,且
0^0→0,
0^1→1,
1^0→1,
1^1→0
此外,一个数与0异或仍保持不变,即a^0=a
一个数与自己异或结果为0,即a^a=0
11.|=
按位或后赋值
变量|=表达式
参与运算的两个量按照对应位进行或运算,且
0|0→0,
0|1→1,
1|0→1,
1|1→1
这些位运算都是与二进制码有关的,所以多弄弄也就会了
㈣ c语言,位符合赋值运算符, <<=,>>=,&=,^=,!=, 分别什么含义啊
1.= 赋值运算符 变量=表达式 如:a=3;将a的值赋为3
2./= 除后赋值 变量/=表达式 如:a/=3;即a=a/3
3.*= 乘后赋值 变量*=表达式 如:a*=3;即a=a*3
4.%= 取模后赋值 变量%=表达式 如:a%=3;即a=a%3
5.+= 加后赋值 变量+=表达式 如:a+=3;即a=a+3
6.-= 减后赋值 变量-=表达式 如:a-=3;即a=a-3
7.<<= 左移后赋值 变量<<=表达式 左移就是将《左边的数的二进制各位全部左移若干位,《右边的数指定移动位数,高位丢弃,低位补0, 移几位就相当于乘以2的几次方
8.>>= 右移后赋值 变量>>=表达式 右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。注意:对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0。如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的
系统移入1。移入0的称为“逻辑移位”,即简单移位;移入1的称为“算术移位”。
9.&= 按位与后赋值 变量&=表达式 按位与是指:参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。按位与其实与逻辑上“与”的运算规则一致。逻辑上的“与”,要求运算数全真,结果才为真。若,A=true,B=true,则A∩B=true
10. ^= 按位异或后赋值 变量^=表达式 参与运算的两个量按照对应的位进行异或运算,且
0^0→0, 0^1→1, 1^0→1, 1^1→0
此外,一个数与0异或仍保持不变,即a^0=a
一个数与自己异或结果为0,即a^a=0
11.|= 按位或后赋值 变量|=表达式 参与运算的两个量按照对应位进行或运算,且
0|0→0, 0|1→1, 1|0→1, 1|1→1
这些位运算都是与二进制码有关的,所以多弄弄也就会了
㈤ c语言赋值语句
复制的:
(1)C++的赋值语句具有其他高级语言的赋值语句的功能。但不同的是: C++中的赋值号“=”是一个运算符,可以写成
a=b=c=d;
而在其他大多数语言中赋值号不是运算符,上面的写法是不合法的。
(2) 关于赋值表达式与赋值语句的概念。在C++中,赋值表达式可以包括在其他表达式之中,例如
if((a=b)>0) cout<<"a>0"<<endl;
按语法规定if后面的( )内是一个条件。现在在x的位置上换上一个赋值表达式“a=b”,其作用是:先进行赋值运算(将b的值赋给a),然后判断a是否大于0,如大于0,执行cout<<"a>0"<<endl;。在if语句中的“a=b”不是赋值语句而是赋值表达式,这样写是合法的。不能写成
if((a=b;)>0) cout<<"a>0"<<endl;
因为在if的条件中不能包含赋值语句。C++把赋值语句和赋值表达式区别开来,增加了表达式的种类,能实现其他语言中难以实现的功能。
请采纳。
㈥ C语言 按位运算 的复合赋值运算符 问题
i&=j就是i=i&j;,i被重新赋值了,下同
㈦ 关于C语言位运算,赋值的问题,回答详细一点。为什么按位取反后输出的结果不一样
2的二进制是00000010,取反得到11111101,最高位为1,说明这是个负数的补码。负数的补码,是由其绝对值的原码取反加1得到,反过来,将负数的补码减1取反,就得到其绝对值的原码。11111101-1=11111100,再取反得到00000011,即十进制的3。也就是说该负数的绝对值为3,那么这个负数为-3。
所以第一个值是-3
整型的每一种都分有无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。
你声明变量无符号,将二进制转换无符号在转换十进制,导致最高位由原来的符号位变成了有效数字位了,参与转换
所以最后结果是253
你去掉前面的unsigned 两个值应该是一样的
㈧ c语言按位运算
unsigned在内存中占2字节即十六位,八进制123456转换为二进制1010011100101110,b=a>>4 b=0000101001110010
c=0000000000001111 b&c即按位与,二进制对应位上全是1才为1,否则为0
d=0000000000000010
即d=2
㈨ C语言 怎么用 1条语句 进行位赋值
取 b的第5位: (b & 0x10)
清 a 的第5位: (a & 0xef)
赋值到a的第5位: a = (a & 0xef) | (b & 0x10);
㈩ 51单片机c语言编程能给位赋值么
keil的话可以。打开你的reg51(或reg52等)头文件,你就会看到已经声明的位变量,
格式是:sbit 位变量名=SFR名^位地址值 (P3也是头文件中最开始部分声明的)
头文件中有
sbit WR=P3^6;
所以你直接写 WR=1就行了