首页 > 其他分享 >C语言 【操作符(上)】

C语言 【操作符(上)】

时间:2024-10-19 20:47:26浏览次数:3  
标签:count int C语言 异或 num 按位 操作符

        最开始提到C语言操作符,我还是有一些不屑的,这玩意有啥学的呀?今天静下心来阅读学习了一下操作符部分的知识,这部分还真得认真学习学习!下面我将操作符中一些比较关键的点进行罗列和详细说明。一来帮助我加深理解,二来希望能帮助到有缘点击进来的读者。

1、算术操作符:+     -    *    /    %

        上面的五种操作符需要提一嘴的就只有除(/)和取余(%)操作符了。这几种操作符除了取余(%)操作符外,其他操作符均可以作用于整数和浮点数,取余操作符的两个操作数必须为整数。而对于(/)操作符,如果两个操作数都是整数,则进行整数除法。而只要是有浮点数执行的就是浮点数整除法。

2、移位操作符:<<   >>

        << : 左移操作符,移位规则:左边抛弃,右边补零。

        >> : 右移操作符,移位规则分为两种:

                1、逻辑移位:左边补零,右边抛弃;

                2、算术移位:左边使用原该值的符号位进行填补,右边抛弃;

3、位操作符:&   |   ^

        & :按位与操作符

        |  :按位或操作符

        ^ :   按位异或操作符            (位操作符的操作数均为整数)

***这有啥讲的呀??来一道题显示它们的真功夫。

        题目1:输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。

        有人想到,我们可以类比取出十进制数字的方法进行求解,是的,我么可以来试一试。思路大概是这样的:

代码实现:

#include <stdio.h>

int main()
{
	int num = 0;
	int count = 0;
	scanf("%d", &num);

	while (num)
	{
		if (num % 2 == 1)
			count++;
		num = num / 2;
	}

	printf("%d\n", count);
	return 0;
}

上面的代码在表面上是可以检查的,当你的输入变成负数之后,例如-1时,程序的输出结果为:

上述的结果显然与事实不符,-1在内存中的形式为补码形式:11111111 11111111 11111111 11111111;也就是32个1,所以显然上述程序的输出结果是错误的。 

所以下面有请我们的主角登场,按位与(&)

        我们当然知道他的运算逻辑,当两个数中有0,结果就为0,两者都为1,结果就为1;

所以也就有了下面的思路:

按照上面的思路,我们将整个整型的每一个比特位进行按位右移并且与数字1按位与,通过检测按位与的结果是否为1,来实现统计原数中1的个数。 

        解法1:

#include <stdio.h>

int NumberOf1(int n) {
    int count = 0;
    int i = 0;

    for (i = 0; i < 32; i++)
    {
       
        if (((n>>i)&1) == 1)
            count++;
    }
    return count;
}

int main()
{
    int num = 0;
    scanf("%d", &num);

    int ret =NumberOf1(num);
    printf("%d\n", ret);
    return 0;
}

让我们来测试一下:

 结果是正确的。

        解法2:

        按照上面的逻辑,可以写出一下程序: 

#include <stdio.h>

int main()
{
	int num = 0;
	int count = 0;
	scanf("%d", &num);

	while (num)
	{
		num = num & (num - 1);//每次计算会消除最右侧的1
		count++;
	}
	printf("%d\n", count);

	return 0;
}

        我们再次使用-1来进行验证算法的正确性,当然也普适于其他数据。

         上述算法提供了一个全新的思路。

题目2:不创建临时变量,实现两个数字的交换。

        两个数交换最常规的思路是创建临时变量,上述题目中要求不使用临时变量,这里可以使用按位异或来进行解决。这里我们需要知道异或的性质。

        简单来说:就是一个数和它自己异或操作的结果为0;0与任意数异或的结果位任意数本身。

借助这个性质,我们便可以做到不使用中间临时变量进行两个数据的交换。 

#include <stdio.h>

int main()
{
	int a = 2;
	int b = 3;
	printf("交换前:a=%d,b=%d\n",a,b);
	a = a ^ b;  //先将两个数的异或结果进行存放
	b = a ^ b;  //a^b^b的结果为a,将a放在b中 b的值为a
	a = a ^ b;  //a^b^a  (b=a)  的结果为b,将b放在a中
	printf("交换后:a=%d,b=%d\n", a, b);

	return 0;
}

标签:count,int,C语言,异或,num,按位,操作符
From: https://blog.csdn.net/qq_70199082/article/details/143058359

相关文章

  • C语言经典游戏代码大全(珍藏版)
    前言发现很多朋友都想要一些小项目来练手,却找不到从哪里寻找,给大家整理了游戏项目开发源代码汇总。一、最经典游戏之俄罗斯方块#include<iostream>#include<math.h>#include<Windows.h>#include<conio.h>#include<ctime>usingnamespacestd; enumDIR{   UP......
  • Linux C语言TCP协议实战
    文章目录1.TCP简介2.搭建框图3.相关函数介绍3.1socket函数3.2bind函数3.3listen函数3.4accept函数3.5connect函数3.6send函数3.7recv函数3.8其他函数4.实战4.1一对一模型4.1.1server.c4.1.2client.c4.1.3终端结果4.2多进程模型4.2.1server.c4.2.2cl......
  • 汉诺塔问题和青蛙跳台阶问题(c语言)
     这俩道题都是利用到了函数递归的思想,其中汉诺塔问题较难理解,青蛙跳台阶则较简单汉诺塔问题题述:设有三根柱子分别时A,B,C,在A柱子上放着n个盘子,每个盘子大小不一样,从下往上盘子大小依次减小,要求将A柱子上的盘子移动到C柱,且不改变盘子顺序(由大往小排序)。规则:1.一次只能......
  • 【C语言】动态内存管理(上)
    本篇博客将讲解以下知识点:(1)为什么要有动态内存分配(2)malloc和free1、为什么要有动态内存分配我们已经掌握的内存开辟方式有:intval=40;//向内存中申请4个字节空间存储valchararr[10];//向内存申请10个字节空间 上述的开辟空间的方式有两个特点:(1)空间的开辟......
  • 【C语言】strncat、strncmp、strstr函数讲解
    本篇博客将讲解函数:strncat、strncmp、strstr函数注意:使用strncat、strncmp、strstr函数时要包含头文件:string.h1、strncat函数的使用(是从目标空间中第一个的‘\0’位置开始追加的)strncat函数原型: char*   strncat(char*destination,  const char* sourc......
  • c语言语法(76-79)10.19
    一.定义数组1.数组定义:2.数组的特点:补:数组内部的特点:左值是读,右值是写3.数组的下标:从0开始计数4.有效的下标范围:从0开始到数组的大小-1的范围当出现以下标志表示数组的下标越界:eg.此代码中的10超过了有效下标9,所以无效会报错二.数组的例子1.eg题目:代码:三.......
  • C语言小白 记录自己对一些概念的理解 若有错误 多包涵 若能指正 万分感激
    指向第一个元素或整个数组用p1=test;直接数组名不用加*而指向第二个或以后的元素则要加*例如p2=&test[1]在C语言中,两个指向同一个数组中相邻元素的指针,计算他们的差值,得到的是它们之间元素的个数,是一个整数比如p1-p0等于1表明第一个到第二个相差一而不是字节数。若想求......
  • C语言练习
    题目:1.编写一段C语言,使之像下面这样交替显示+和-,总个数等于所输入的整数值。另外当输入0以下的整数时,则什么也不显示。正整数:13【】+-+-+-+-+-+-+分析:1.首先题目要求交替显示,所以这表明了要筛选,所以我们可以用嵌套循环完成它(至于什么是嵌套循环,请看往期知识点)    ......
  • C语言指针
    1.程序中地址与指针实例讲解Hi!欢迎来到指针的世界,也许您早已听过它的大名,指针被称为是C语言的精华所在。真正理解和掌握指针是征服C语言的关键所在!在众多的计算机语言中,试问:还有哪门语言可以有C语言这样在作用、速度和安全上平衡得如此优异的呢?而指针则在其中扮演了重要的角......
  • PTA L1系列题解(C语言)(L1_081 -- L1_088)
    L1-081今天我要赢题目内容:2018年我们曾经出过一题,是输出“2018我们要赢”。今年是2022年,你要输出的句子变成了“我要赢!就在今天!”然后以比赛当天的日期落款。输入格式:本题没有输入。输出格式:输出分2行。在第一行中输出I'mgonnawin!Today!,在第二行中用年年年......