【刷题笔记】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

相关文章
|
2月前
|
C语言
c语言编程练习题:7-10 算术入门之加减乘除
对于输入的两个整数,按照要求输出其和差积商。
80 0
|
9月前
|
编译器 C语言 C++
【刷题笔记】Day1:操作符的使用和算术转换(下)
【刷题笔记】Day1:操作符的使用和算术转换(下)
|
2月前
|
存储 Linux C语言
C语言初阶⑥(操作符详解)编程作业(算数转换)(下)
C语言初阶⑥(操作符详解)编程作业(算数转换)
21 1
|
2月前
|
存储 C语言 索引
C语言初阶⑥(操作符详解)编程作业(算数转换)(上)
C语言初阶⑥(操作符详解)编程作业(算数转换)
30 0
|
2月前
|
存储 编译器
有趣的移位操作符和位操作符(由浅入深轻松搞定!)
有趣的移位操作符和位操作符(由浅入深轻松搞定!)
|
10月前
|
程序员 数据安全/隐私保护 测试技术
深入理解按位操作符:位运算的魅力
尽管按位操作符在日常编程中并不经常使用,但它们是强大的工具,可以用于许多不同的情况。通过深入理解这些操作符的工作原理和实际应用,程序员可以更好地利用它们来解决问题,提高代码的效率和可读性。
180 3
|
12月前
|
C语言
牛客网语法篇刷题(C语言) — 运算
牛客网语法篇刷题(C语言) — 运算
58 0
|
存储 算法 编译器
你是真的“C”——操作符详解【下篇】+整形提升+算术转换
详解C语言中操作符+算术转换+整形提升知识点~
129 1
你是真的“C”——操作符详解【下篇】+整形提升+算术转换
|
存储 编译器 C语言
初阶C语言 第四章-------《操作符》 (逻辑操作符,算术操作符,逗号表达式,三目操作符)知识点+基本练习题+深入细节+通俗易懂+完整思维导图+建议收藏
初阶C语言 第四章-------《操作符》 (逻辑操作符,算术操作符,逗号表达式,三目操作符)知识点+基本练习题+深入细节+通俗易懂+完整思维导图+建议收藏