2021-4-27C语言基础位移运算符实现比较for菜鸡

菜鸡专题


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、C语言基础

挑着记笔记
^是异或
~是非
这两个是位运算符

一个小题

Description
输入两个整数,输出较大的值。
Input
输入两个整数。
Output
输出较大的值。
Hint
注意:要求不能使用 if, <, >, ?运算符

很有意思的一道题,考的是位运算符。

思考过程

不能直接比较,脑袋里过了一下,发现只有位运算符和加减乘除能用一用,其他的,特殊的的位运算符,所以着重考虑位运算符怎么解决这个问题。两个数,比较大小我们可以想一想两个数相减,因为其他的+*/不太好实现。
这里有一个知识点,就是C语言中,有符号数,的首位正数是0,负数是1,涉及到了补码什么的,也不用多考虑,记住就好了。
正负数,区别就在最高位,如果是int类型的,那么就是第32位,其他位置可能都不一样,那么只需要讲这个数位移31位,这样最高位就到了最后一位。这里有涉及到了一个知识,逻辑位移和算数位移。

在C语言标准中,有两种位移分别为算术位移和逻辑位移。

逻辑位移:在位移运算符(>>和<<)之前的数是无符号数,编译产生的汇编指令是逻辑位移。
算术位移:在位移运算符之前的数是有符号数,编译产生的汇编指令是算术位移。
左移:两种位移都在右边补0。
右移:逻辑位移在左边补0,算术位移在左边补符号位。

所以一个有符号数,向右位移31位那么,这个数不是32个0就是32个1,这样就好做了,如果说32个1与数字1做&运算,那么结果是1,如果32个0与数字1做&运算,那么结果就是0,如果是1,那么原数是负数,如果是0那么原数是正数。所以a,b两个数,相减之后,与1相与就知道谁大谁小了。知道大小了,如何输出大的数呢?我首先考虑的是a +|a-b|意思是,a加上a与b之间的距离,想办法把绝对值拆掉,试了试,a-(a-b)*c是可以解决的。这里就是单纯的组合一下就解决了。

#include<stdio.h>

int main() {
	int a, b;
	scanf("%d %d", &a, &b);
	int c = (a - b) >> 31 & 1;
	printf("%d", a - (a - b) * c);
}

总结

加油

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值