【刷题笔记】Day1:操作符的使用和算术转换(上)

简介: 【刷题笔记】Day1:操作符的使用和算术转换(上)

操作符的使用


1.不允许创建临时变量,交换两个整数的内容

这里用到^异或操作符:相异为1,相同为0

用到两个规律

1.a^a=0

2.a^0=a

整体思路:

a=3^3^5==0^5=5

异或是支持交换律的

为证明3^5^3==5

011-->3

101-->5

110--->中间值

   |

011-->3

   |

101-->5

#include<stdio.h>
int main()
{
  int a = 3,  b = 5;
  printf("交换前:%d %d\n", a, b);
  a = a ^ b;
  b = a ^ b;//-->b=a^b^b==a^0=a
  a = a ^ b;//-->a=a^b^a==0^b=b
  printf("交换后:%d %d\n", a, b);
  return 0;
}

a13d782bd20c4344adb03a7c782898c5.png


2.写一个函数返回参数二进制中 1 的个数。

比如: 15    0000 1111    4 个 1

思路:

f6fbbb9a20724c15a70e716c84f6df7e.png


方法1: 统计1的个数,遇到0跳过

//写一个函数返回参数二进制中 1 的个数。
//
//比如: 15    0000 1111    4 个 1
//这种算法对负数有点问题
int count_one_bit(int num)//这里要把 int 换成 unsigned int才能统计负数的1的个数
{
  int count = 0;
  while (num)
  {
    if (num % 2 == 1)//统计1的个数,遇到0跳过
    {
      count++;
    }
    num /= 2;
  }
  return count;
}
int main()
{
  int num = 0;
  scanf("%d", &num);
  int ret = count_one_bit( num);
  printf("%d\n", ret);
  return 0;
}


这个写法存在缺陷:

75c845e690724fff946904072494bfb1.png

执行效果:

914b4923f1144e88b5940c2db10443de.png

注意:当写成int类型的时候,用的时候是当成原码用的

当把int num换成unsigned int num时

当num等于-1时

-1

10000000000000000000000000000001 -- 原码 —>我们日常生活中使用的

11111111111111111111111111111110  -- 反码

11111111111111111111111111111111  -- 补码

unsigned int 则认为-1补码全为有效位,不存在符号位,

0dfc3f8186ec40d9876a2bb1fb8955bd.png


方法2:右移操作符,&1得到最低为二进制最低位

int count_one_bit(int num)//这里参数无论unsigned int 还是int都能拿到每个bit位的&的结果
{
  int count = 0;
  int i = 0;
  for (i = 0; i < 32; i++)
  {
    if ((num >> i) & 1 == 1)//num是不会动的,不会改变num的值,下次回来循环的时候num的值还是原来的,变的只是i
    {
    count++; 
        }
  }
  return count;
}


1c623acaeb8548fbae49ab59ea59146c.png

方法3:n=n&(n-1)

int count_one_bit(int num)
{
  int count = 0;
  while (num)//只要num不为0,num里面就存在1
  {
    num = num & (num - 1);//去掉一个1
    count++;
  }
  return count;
}


原理:

8d5ff1454cde4b59bb0bc89b0f35d625.png

题目类型:接口型和oj型,oj的意思是在线判题

e104166c76be4235a510c45a4a435b99.png


3.获取一个整数二进制序列中所有的偶数位和奇数位分别打印出二进制序列


方法:偶数位和奇数位的最高位和最低位到整个bit位最低位的距离

//记住:获得一个数的最低位,&1就可以了
//获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
//1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
#include<stdio.h>
int main()
{
  int num = 0;
  scanf("%d", &num);
  int i = 0;
  //偶数位
  printf("偶数位:");
  for (i = 31; i >= 1; i-=2)
  {
    printf("%d ", (num >> i) && 1);
  }
  printf("\n");
  //奇数位
  printf("奇数位:");
  for (i = 30; i >= 0; i-=2)
  {
    printf("%d ", (num >> i) & 1);
  }
  printf("\n");
  return 0;
}


以偶数位为例子,图解:

5502ffbe61c14e60aa583613f12771fd.png

执行效果:

b1123749706248e0b5b81111667743df.png

相关文章
|
8月前
|
C语言
c语言编程练习题:7-10 算术入门之加减乘除
对于输入的两个整数,按照要求输出其和差积商。
130 0
|
编译器 C语言 C++
【刷题笔记】Day1:操作符的使用和算术转换(下)
【刷题笔记】Day1:操作符的使用和算术转换(下)
|
4月前
|
程序员 C语言
【C语言基础考研向】06运算符与表达式
本文介绍了C语言中的运算符分类、算术运算符及表达式、关系运算符与表达式以及运算符优先级等内容。首先概述了13种运算符类型,接着详细说明了算术运算符的优先级与使用规则,以及关系运算符和表达式的真假值表示,并给出了C语言运算符优先级表。最后附有课后习题帮助巩固理解。
133 10
|
8月前
|
存储 Linux C语言
C语言初阶⑥(操作符详解)编程作业(算数转换)(下)
C语言初阶⑥(操作符详解)编程作业(算数转换)
42 1
|
8月前
|
存储 C语言 索引
C语言初阶⑥(操作符详解)编程作业(算数转换)(上)
C语言初阶⑥(操作符详解)编程作业(算数转换)
49 0
|
8月前
|
存储 编译器
有趣的移位操作符和位操作符(由浅入深轻松搞定!)
有趣的移位操作符和位操作符(由浅入深轻松搞定!)
|
存储 编译器 C语言
【C语言初阶】表达式求值(隐式类型转换,算术转换)
目录 表达式求值 一、先补充一点(为下文做准备) 1.首先,要了解原码、反码、补码(简单说一下) 2.有符号(signed)与无符号(unsigned)的区别 二、隐式类型转换(整型提升) 1.什么是整型提升? 2.整型提升的意义 3.有符号(signed)类型的整型提升 3.无符号(unsigned)整形提升 4.简而言之 5.例子 三、算术转换 四、
252 0
【C语言初阶】表达式求值(隐式类型转换,算术转换)
|
存储 C语言
c语言学习第三课—简单介绍数组与操作符
c语言学习第三课—简单介绍数组与操作符
83 0
|
存储 编译器 C语言
C语言—零基础_学习_复习_第四课】数据类型及其运算
在生活中也有不同的类型,比如说人、动物、植物都是表示他们自身的属性,在计算机中也不例外。在C语言中数据类有基本数据类型和非基本数据类型,常见的数据类型包括整型、实型、字符型。
134 0
|
C语言
牛客网语法篇刷题(C语言) — 运算
牛客网语法篇刷题(C语言) — 运算
91 0