C语言按位运算符如何使用(c语言,开发技术)

时间:2024-05-04 12:30:18 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

为了避免发生这种现象,我们可以采取异或的方法来实现这道题:

C语言按位运算符如何使用

最后还有一个很简单的按位取反操作符:~

用途:对一个数的二进制按位取反(包括它的符号位)

注意:以上的位运算符,他们的操作数必须是整数!

1.3 一个关于整型提升的问题

有这样一串代码,问:为什么一个char类型大小可以求出来是4字节?

C语言按位运算符如何使用

无论任何位运算符,都是要计算机进行计算的,而计算机中CPU具有运算能力,但计算的数据都是放在内存中的。所以,做任何运算,都必须将数据从内存拿到CPU的寄存器中。而寄存器默认的操作数宽度是32位,可是,char类型数据只有1个字节,也就是8位,不满足32位怎么办,这就需要整型提升了!(详细整型提升大家可以查阅资料哦)

如果是一个有符号数的话:高位补符号位

如果是一个无符号数的话:高位补0

2、移位操作符

2.1 左移<< 右移>>操作符

<< 左移运算符是一个双目运算符,功能是把左边的运算数的各个二进制位向左移动指定位数。

>> 右移运算符是一个双目运算符,功能是把右边的运算数的各个二进制位向右移动指定位数。

注意:

<< 左移:最低位丢弃,最高位补零

>> 右移:

  1. 无符号数:最低位丢弃,最高位补零 [逻辑右移]

  2. 有符号数:最低位丢弃,最高位补符号位 [算数右移]

以上在补码中进行运算

警告:移位运算符,请不要移动负数位,这是标准未定义的!

左移我们好说,主要是右移我们需要细讲一下:

C语言按位运算符如何使用

明显看到,这是在无符号数下进行右移,第一个小伙伴都不会感到惊讶, 可是第二个就有点不理解了,我们来解释下:

这里有一个问题,当 -1 准备放入变量 b 的时候我们需要看-1的类型吗?

答案是不需要!内存中放的都是二进制补码,本质上是把 -1 的补码放入变量 b 当中,第二,右移操作符属于计算,需要在CPU中进行,所以需要先把内存中 -1 的补码拿到CPU寄存器中运算,按照我们的规则,右移中,无符号数低位丢弃高位补零,所以 -1 右移完成之后就变成了 0111 1111 ... 1111 1111,接着我们以 %d 有符号整型打印,就会把他当作有符号数看待,最高位是 0 所以被认为是正数,转化成十进制也就是如上打印的值。

第二个我们来看下有符号数右移:

C语言按位运算符如何使用

这个相信大家就很好理解了,第一个高位补符号位也就是补 0,低位丢弃,所以结果是 0,第二个高位补符号位也就是补 1,低位丢弃,值仍然不变,还是 -1。

注意:a>>1 并不会改变 a 变量的值,就好比如 a + 1。这样写才会改变:a = a >> 1;

2.2 习题练习

学完了上期的逻辑操作符,和本期的移位操作符,我们来练练手:

请你设计一个宏可以指定数据第几个比特位更改为 1 ,并设计一个函数将各个比特位打印出来。

//参考

defineSETBIT(a,num)((a)|=(1<<(num-1)))

voidPrintBit(inta)
{
intnum=31;
while(num>=0)
{
if((a&(1<<num)))
printf("1");
else
printf("0");
--num;
}
printf("\n");
}
intmain()
{
inta=0;
SETBIT(a,5);
PrintBit(a);
return0;
}

3、++和--的操作

3.1 基本操作

其实这节知识点理解起来是很简单的,只不过总有些学校喜欢出一些很拉跨的题目:

int i = 3; 问:(++i) + (++i) + (++i) 的值是多少?

我的建议是,看到这类题,直接空着,你也可以在下面添一句,“ 你礼貌吗?”

这种表达式,在任何编译器下算出来的结果是不一样的!

C语言按位运算符如何使用

对于这种问题没必要去争论谁对谁错, 如果有人想跟你杠的话,那么你直接告诉他,你真的超级高水平。

好了,言归正传,我们来说一下 ++ 和 -- 的基本理解:

  1. 前置++ -- :先自增(减),再使用

  2. 后置++ -- : 先使用,再自增(减) 如果没有变量接收,那么直接自增。

例子:

C语言按位运算符如何使用

基本使用就是这么多,接下来我们从汇编角度来深度理解一下:

3.2 从汇编角度深入理解a++

既然我们知道,后置++ 是先使用后++,如果我们单纯的就 ++ 一下呢,他这个值被使用到了哪里去了呢?

intmain()
{
inta=0xDD;
intb=a++;//有b接收,那么a的先使用是将a的值(内容),放到b中
intc=0xEE;
c++;//没有接收方,那么"先使用",如何理解?
return0;
}

vs2019编译器反汇编:

C语言按位运算符如何使用

结论:后置++ 完整的含义是先使用,在自增,如果没有变量接收,那么直接自增。

注意:在不同的编译器可能处理过程不同,不过这是一个基本的研究过程,比单纯的理论学习更严谨。

相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。

本文:C语言按位运算符如何使用的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:MySQL数据库完全备份与增量备份怎么实现下一篇:

10 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18