一些代码优化中的小技巧(表达式优化部分)
奇偶数判断优化
一般情况下判断奇偶数都是用
if (0 == a % 2)
但可以优化为:
if (0 == a & 1)
取偶与取奇
有时候需要对一些数进行取偶,那么代码可以优化为:
取偶:a += a&1
取奇:a += 1-(a&1)
一般情况下判断奇偶数都是用
if (0 == a % 2)
但可以优化为:
if (0 == a & 1)
有时候需要对一些数进行取偶,那么代码可以优化为:
取偶:a += a&1
取奇:a += 1-(a&1)
由于某些不可抗拒的原因,要搞go,事实上我是非常抵制,主要原因还在于go的开发环境等都不够成熟,另外也没有必要非要用go,除了由于python的gil性能问题意外,其实c、c++、python就已经足够满足大部分开发需求了。就连音视频部分的绝大部分都已经能够胜任。
唉,在vs code中虽然配置看上去虽然简单,但由于go语言本身坑爹的编译环境加之vs code整体性不如vs,因此还是遇到不少坑。
坑爹一:在使用go调试代码时用到了dlv,非调试运行环境也最好用dlv,不要用code runner。
具体表现为,使用start without debug,不要使用run code。由于在gopath的问题上,code runner在go开发环境上本着能坑死一个算一个的目标,让人哭笑踢飞。
持续更新中…….
最近osx环境无意间升级了所有的包,并把xcode升级到了9。按部就班的继续编译之前可以正常编译的webrtc,后来不料,除了这么一个错误:
error: nullability specifier ‘_Nullable’ cannot be applied to non-pointer type ‘uuid_t’ (aka ‘unsigned char [16]’)
东查西查。最后就查到了之前的猜测,这里有解释:
https://forums.xamarin.com/discussion/103773/will-there-be-support-for-ios-11-sdk
因为xcode自带的是ios sdk 11的。就目前来说,这一点比较坑人,因为ios sdk 11的库和ios sdk 10的库在部分函数上的定义上有所区别。
而webrtc和相应的depot_tools也是今年年初的,因此使用的第三方clang编译器也相对xcode 9的步调来说老了一些。
为了不想增加麻烦,也就不打算用gclient了,因为当时不是我去拿的webrtc代码,也不知道会不会有坑。就果断把xcode降级为xcode 8。
xcode 8的下载地址:
https://developer.apple.com/download/more/
降级的方法:
http://osxdaily.com/2012/02/20/uninstall-xcode/
看来用第三方编译器也是让人比较头疼的一件事情。有时候ios上遇到的坑不比android少。。。
在看webrtc的代码时,遇到一个ip地址池在set和vector中颠来倒去的代码,顶着看了一会,后来才反应过来。代码如下:
std::set<rtc::SocketAddress> addrs(all_servers_addrs_.begin(),all_servers_addrs_.end()); all_servers_addrs_.assign(addrs.begin(), addrs.end());
原先在all_servers_addrs_中已经保存了一个ip列表,通过导到set之后,首先去重了ip,接着再按照’>’算术运算符来进行排序,接着在通过assign将排序去重后的数据返回vector。
这样做的好处在于,时间复杂度为set排序复杂度+set随机访问的时间复杂度的总和,大致可以避免vector(类似线性表)的较高插入删除复杂度的问题。
首先说明,本文章讲述的是C、C++方面的奇葩类笔试题,之所以奇葩是因为没有考到C、C++中真正需要关注的部分,也间接能看出出题人对C、C++的了解层度。
最近在外面试,有做笔试,也有不做笔试的。因为工作有一些时段,所以不做笔试也算说的去,但一遇到做笔试题往往弄得我哭笑不得。不是拿一些太基础的题来糊弄人,就是拿一些技巧性的题目来糊弄人。最为关键是招聘方所谓的技术人员还很自以为是。面试应该是互相尊重的过程,而不是耀武扬威的一个过程,下面就分享这么一题笔试题,也算是复习一下我自己的基础。
int count=0; int iarraytestA[10] = {11}; int iarraytestB[10] = {11}; int iarraytestC[10] = {11}; while(count < 10) { iarraytestA[count++] = count; } count = 0; while(count < 10) { iarraytestB[++count] = count; } count = 0; iarraytestC[++count] = count;
求iarraytestA和iarraytestB的结果。用vs跑了一下,结果一样:
iarraytestA:0,1,2,3,4,5,6,7,8,9
iarraytestB:11,1,2,3,4,5,6,7,8,9
iarraytestB:11,1,0,0,0,0,0,0,0,0
后来仔细想想,这个应该是算术优先级的问题。这里面的符号有几个:
赋值、自增(前向和后向)、数组寻址
查了一下符号优先级表,发现++运算符的优先级和[]一样,而=的优先级就不用多说,应该是最低的。
由此可以得出上述结论。
首先在这套题里,主要考了笔试C、C++中对这几个符号的认识,另一个这道题最蠢的还在于使用了不该用的技巧在考人。在C、C++规范中对相同优先级的符号做过的约束并不是很明确(C++11有所改善),在高效C++中有大量例子说明不应该使用技巧性过强的写法,这样会导致不同编译或不同编译参数编译出来的代码有不同行为。
这也同样说明了出该笔试题的人对C++也不是那么了解,真正在C++中笔试中有很多类型的题目可以出,但也不是都能出,因为语言规范的原因,对于单纯考算法的问题,也有很多大神做过讨论。我只是觉得学以致用,考什么都不要紧,关键和工作实质内容有没有关联?
ps:另外强烈鄙视钓鱼招聘,叫人过去面试就是为了打探技术方法和商业信息!