菜鸡专题
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、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);
}
总结
加油