【C语言】操作符

简介: 【C语言】操作符

前言

🎈大家好,我是何小侠🎈

🌀大家可以叫我**小何或者小侠🌀**

🔴我是一名普通的博客写作者🔴

💐希望能通过写博客加深自己对于学习内容的理解💐

🌸也能帮助更多人理解和学习🌸

🍃我的主页:何小侠的主页🍃


这篇博客我们一起来学习C语言中操作符的一些理解和技巧,可能不会涵盖所有操作符,但是应该会让你有所收获。

移位操作符🍊

移位操作符又分左移操作符和右移操作符

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

注意:移位操作符的操作数只能是整数。

左移操作符🍊

左移操作符操作的其实是操作数的二进制位,

操作规则是左边丢弃,右边补0

首先我们先介绍一些基本知识

然后我们再来看实际的代码:

#include<stdio.h>
int main()
{
  int a = 5;
  int b = a << 1;
  printf("%d\n", a);
  printf("%d", b);
  return 0;
}

我们看看这行代码的答案

结果 a = 5 ,b = 10,这两个数很巧,这其中会不会有什么关系呢?

我们大胆猜测只要 左移1位就是将这个数扩大两倍。

接下来我们看看二进制位的变化,来证明这个猜测。

或者写清楚点 2^1(2 ^ 2 + 2 ^ 0) = 2 ^ 3 + 2 ^ 1.

相信大家看这张图就应该能够理解了。

然后我们讨论为a = -5 的情况。

#include<stdio.h>
int main()
{
  int a = -5;
  int b = a << 1;
  printf("%d\n", a);
  printf("%d", b);
  return 0;
}

我们还是用图来讲解:

其实还是相当于乘了一个2,

右移操作符🍊

移位规则:

首先右移运算分两种:

  1. 逻辑移位
    左边用0填充,右边丢弃
  2. 算术移位
    左边用原该值的符号位填充,右边丢弃
    算术右移和逻辑右移取决于编译器,一般都是算术右移,我用的VS也是算术右移。

我们依旧是先上代码

int main()
{
  int a = 5;
  int b = a >> 1;
  //00000000000000000000000000000101
  printf("a=%d b=%d\n", a, b);
  return 0;
}

结果是

我们还是大胆猜测是不是除过二就行了,我们先画图研究这个过程

如果你还是不相信可以自己试一试.

接下来我们看负数

这里的技巧是,把 (a + (-1)) / 2 就行了。

位操作符🍊

& 按位与

| 按位或

^ 按位异或

这三个也全都是操作二进制位,所以

他们的操作数必须是整数。

&

int main()
{
    int a = 3;
    int b = -5;
    int c = a & b;
    //00000000000000000000000000000011  -> 3的补码
    //11111111111111111111111111111011  -> -5的补码
  //&   00000000000000000000000000000011 (相同为1,相异为0)
    //10000000000000000000000000000101  -> -5的原码
    //11111111111111111111111111111010  -> -5的反码
      printf("%d\n", c);
}

|

int main()
{
    int a = 3;
    int b = -5;
    int c = a | b;
    //00000000000000000000000000000011  -> 3的补码
    //11111111111111111111111111111011  -> -5的补码
  //|   11111111111111111111111111111011 (有1为1,无1为0)补码还需要转换为原码
    //10000000000000000000000000000101  -> -5的原码
    //11111111111111111111111111111010  -> -5的反码
      printf("%d\n", c);
}

^

int main()
{
    int a = 3;
    int b = -5;
    int c = a ^ b;
    //00000000000000000000000000000011  -> 3的补码
    //11111111111111111111111111111011  -> -5的补码
  //^   11111111111111111111111111111000  
  //    11111111111111111111111111110111   反码
  //    10000000000000000000000000001000   原码
    //10000000000000000000000000000101  -> -5的原码
    //11111111111111111111111111111010  -> -5的反码
      printf("%d\n", c);
}

最后我们要说^的技巧

^的技巧

🍊

如果一个a = 5
那么a ^ a = 0.

如果a ^ 0 = a .

最后来一个经典的提莫

现在有一个数组放了一个单身狗个单身狗,1 2 3 4 5 1 2 3 4找出这个单身狗。

方法,将所有的数异或最后就变成了5^0就是5

#include<stdio.h>
int main()
{
  int arr[] = { 1,2,3,4,1,2,3,4,5 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  int i = 0;
  int j = arr[0];
  for (i = 1; i < sz; i++)
  {
    j ^= arr[i];
  }
  printf("%d", j);
  return 0;
}

总结🍊

这篇博客我们介绍了移位操作符,和位操作符的技巧,希望能加强我们对于二进制的理解和熟练程度。

最后如果这篇博客有帮助到你,欢迎点赞关注加收藏

如果本文有任何错误或者有疑点欢迎在评论区评论



目录
相关文章
|
3月前
|
存储 C语言 索引
【C语言篇】操作符详解(下篇)
如果某个操作数的类型在上⾯这个列表中排名靠后,那么⾸先要转换为另外⼀个操作数的类型后执⾏运算。
72 0
|
3月前
|
程序员 编译器 C语言
【C语言篇】操作符详解(上篇)
这是合法表达式,不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。
247 0
|
20天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
33 10
|
1月前
|
存储 编译器 C语言
【C语言】简单介绍进制和操作符
【C语言】简单介绍进制和操作符
157 1
|
1月前
|
存储 编译器 C语言
初识C语言5——操作符详解
初识C语言5——操作符详解
164 0
|
3月前
|
C语言
C语言操作符(补充+面试)
C语言操作符(补充+面试)
45 6
|
3月前
|
存储 编译器 C语言
十一:《初学C语言》— 操作符详解(上)
【8月更文挑战第12天】本篇文章讲解了二进制与非二进制的转换;原码反码和补码;移位操作符及位操作符,并附上多个教学代码及代码练习示例
56 0
十一:《初学C语言》—  操作符详解(上)
|
4月前
|
C语言
五:《初学C语言》— 操作符
本篇文章主要讲解了关系操作符和逻辑操作符并附上了多个代码示例
43 1
五:《初学C语言》—  操作符
|
5月前
|
C语言
C语言逻辑操作符的短路问题
C语言逻辑操作符的短路问题
|
5月前
|
编译器 C语言
【C语言】:中移位操作符,位操作符详运算规则详解
【C语言】:中移位操作符,位操作符详运算规则详解
41 1