位左移运算是什么意思 位移运算的主要用途是什么?

[更新]
·
·
分类:互联网
1211 阅读

位左移运算是什么意思

位移运算的主要用途是什么?

位移运算的主要用途是什么?

先说一下位运算的简单用法
1. 按位与
用途:清零,取一个数中的某些指定位,保留一个数中的某些指定位
2. 按位或 |
用途:将一个数的某些位指定为1
3. 按位异或 ^
用途:交换两个数
aa^b; ba^b; aa^b
4. 左移 , 右移
左移代表数值*2
右移代表除以2
在进行位与、或、异或运算时,如果两个运算对象的类型一致,则运算结果的类型就是运算对象的类型。比如对两个int变量a和b做与运算,运算结果的类型还是int型。如果两个运算对象的类型不一致,则要对不一致的类型进行类型转换,变成一致的类型,然后进行运算。

C 中左移和右移位具体的步骤是怎么回事?

这里有个隐式类型转换先简单说一下,然后再来修改完善,如有不对欢迎指出,谢谢。
大体就是,C语言中,宏定义在预处理阶段是直接替换的,也就是直接用7来替换size,7是int类型。
当表达式中有int类型的时候,操作数unsigned int会被自动隐式转换为int类型,(一般是低精度转换为高精度)也就是这里的分开的a和t都会转化为int类型,但是,这里a在下一行代码中又通过赋值语句,把a赋值给本身的unsigned int类型了。也就是又把a的值从int类型转换回unsigned int类型了。但是t却并没有这样做。背景:无符号类型的整数在做右移位运算时,左边高位默认补0,右边的低位舍弃,也就是这里的a,初始值为0000 0001当这个数向左移7位,右侧低位补0,也就是变成了1000 000016进制也就是80然后按位取反,0111 111116进制也就是7f然后再右移7位,高位补0,也就是变成了0000 0000再来说t。
当预处理时,会把size用7来替换,这里的7,编译器默认认为是int类型的(这点我不太敢确认,需要翻书),当t执行完向左移7位后,和a一样,变成,表达式tltlt7,的值变为,1000 0000然后按位取反,得到0111 1111也就是7f然后再右移7位,按照前面说的,因为已经把表达式的值转换为int类型,所以,对于有符号的int类型做右移运算,高位要补符号位1,结果为1111 1110fe待完善。