本帖最后由 刘蕴学 于 2012-5-20 12:37 编辑
导语:表要瞧不起基础,表要攀比工具,基础无所不能!真的是酱紫吗?
我不想知道你们的基础是多么烂,请原谅我用这个词,我只想知道,你敢不敢跟着我把这些题全做下去,直到完虐入学测试的考试,嗯,就这么简单。
觉得难的请认真看老毕视频第二天13-16四节视频。
第三个,仍然是集合
这个题稍微有点简单了,主要还是灵活运用,考思维的,第二题如果你掌握了,这题不难。
按照第二题的方式实现给定集合A{0,1....172,173}用一个int表示
这个题就是2个short(byte)的事情,我的说话方式以及描述都在误导你放弃最简单的方式。当然在实际开发中,如果这个连续的集合是可以预期的,尽量采用这种方式来传输或者保存,以减小空间占用。
举个例子吧,比如说服务端给客户端传递1个帖子,是不是得有楼层编号,这里你只需要告诉客户端有帖子有多少回复就行了,而不是每个回复的数据区都写一个int来传这个回复的编号。
也许你们觉得我这是无聊,是吃饱撑的,但我要说,工作中,你的想法会很多,如果一份代码,你每天都有想法,每天都在改,或者你是个完美主义者,那么你永远无法按时完成工作,你把大部分时间都浪费在你的所谓的更好的想法上了。
工作中的要点就是第一时间写出功能,不考虑优化(除非你确认你这个优化是有效的,你很熟练可以默写),等到项目完成之后,回过头来在去检验你的那些想法,没人会花钱雇佣一个不能按时完成工作的人。
由于原来的第二题可能有点不好理解,换个试试,上过初中的看不懂的自己撞墙去
第二个,集合
1.给定集合A{0,1,2.....30,31}
2.给定集合B{5,6....10,11}
3.求 A 和 B 的交集
4.求 A 和 B 的并集
5.求 B 相对于 A 的补集
6.求 A 对 B 差集
7.求给定集合 C{7,9} 是 A 和 B 哪个集合的子集,并实现任意集合子集的查询功能
8.以上所有集合必须使用一个int表示而非数组,所有代码均以按位运算符进行
9.使用查表法可以根据int表示的集合正确输出该集合所表示的数组。
10.必须详细写出解题思路,实现方法。去工作之后,你写的代码不是给你自己看的,是给别人看的,你不写设计思路,不写注释,你让人怎么看?
答案在25楼,24楼是位运算的笔记 22,23楼的解题思路你们也可以看下,而26楼是一个简单的用户权限实现,很基础的应用,真的权限机制比这个复杂太多。
第一个
用最简便的单循环输出如下,并详细写出原理以及解题思路,并说明其中问号处应该填什么?用字符串的木有小JJ,如果你真觉得等号后边的一排1没变化,那你可就错喽
本题13楼以及15楼的方式将不在有分,但是,还有另外一种方式,写的出来仍然有分。- 11111111111111111111111111111110 ? 00000000000000000000000000000001 = 11111111111111111111111111111111
- 11111111111111111111111111111100 ? 00000000000000000000000000000011 = 11111111111111111111111111111111
- 11111111111111111111111111111000 ? 00000000000000000000000000000111 = 11111111111111111111111111111111
- 11111111111111111111111111110000 ? 00000000000000000000000000001111 = 11111111111111111111111111111111
- 11111111111111111111111111100000 ? 00000000000000000000000000011111 = 11111111111111111111111111111111
- 11111111111111111111111111000000 ? 00000000000000000000000000111111 = 11111111111111111111111111111111
- 11111111111111111111111110000000 ? 00000000000000000000000001111111 = 11111111111111111111111111111111
- 11111111111111111111111100000000 ? 00000000000000000000000011111111 = 11111111111111111111111111111111
- 11111111111111111111111000000000 ? 00000000000000000000000111111111 = 11111111111111111111111111111111
- 11111111111111111111110000000000 ? 00000000000000000000001111111111 = 11111111111111111111111111111111
- 11111111111111111111100000000000 ? 00000000000000000000011111111111 = 11111111111111111111111111111111
- 11111111111111111111000000000000 ? 00000000000000000000111111111111 = 11111111111111111111111111111111
- 11111111111111111110000000000000 ? 00000000000000000001111111111111 = 11111111111111111111111111111111
- 11111111111111111100000000000000 ? 00000000000000000011111111111111 = 11111111111111111111111111111111
- 11111111111111111000000000000000 ? 00000000000000000111111111111111 = 11111111111111111111111111111111
- 11111111111111110000000000000000 ? 00000000000000001111111111111111 = 11111111111111111111111111111111
- 11111111111111100000000000000000 ? 00000000000000011111111111111111 = 11111111111111111111111111111111
- 11111111111111000000000000000000 ? 00000000000000111111111111111111 = 11111111111111111111111111111111
- 11111111111110000000000000000000 ? 00000000000001111111111111111111 = 11111111111111111111111111111111
- 11111111111100000000000000000000 ? 00000000000011111111111111111111 = 11111111111111111111111111111111
- 11111111111000000000000000000000 ? 00000000000111111111111111111111 = 11111111111111111111111111111111
- 11111111110000000000000000000000 ? 00000000001111111111111111111111 = 11111111111111111111111111111111
- 11111111100000000000000000000000 ? 00000000011111111111111111111111 = 11111111111111111111111111111111
- 11111111000000000000000000000000 ? 00000000111111111111111111111111 = 11111111111111111111111111111111
- 11111110000000000000000000000000 ? 00000001111111111111111111111111 = 11111111111111111111111111111111
- 11111100000000000000000000000000 ? 00000011111111111111111111111111 = 11111111111111111111111111111111
- 11111000000000000000000000000000 ? 00000111111111111111111111111111 = 11111111111111111111111111111111
- 11110000000000000000000000000000 ? 00001111111111111111111111111111 = 11111111111111111111111111111111
- 11100000000000000000000000000000 ? 00011111111111111111111111111111 = 11111111111111111111111111111111
- 11000000000000000000000000000000 ? 00111111111111111111111111111111 = 11111111111111111111111111111111
- 10000000000000000000000000000000 ? 01111111111111111111111111111111 = 11111111111111111111111111111111
复制代码 这个题的考点不在于你到底对位运算有多了解,而是位移操作你是否熟练,以上图为例,这表示了3种唯一操作符,我是拿这个图来解释3种位移操作符的区别
第一列为左移,第二列为无符号右移,第三列为有符号位移,但单拿解题来说,前俩个操作求第三列也可以,恒值也可以,但主要是3列之间的关系。
如果你把第0行打印出来的话,第一行是第一列表示负数最大值,第一行第二列0表示正数最小值,这么是因为0算在正数里,区分为最高位的符号位
而第31行第一列为int的最小值,第二列为int最大值。而第二列的数其实也是2 4 8 16 32 64 128...进制的最大值。
第一列和第二列存在互补关系,也就是说通过~x可以拿到另外一列。
我着重强调好几次,要找规律,规律不就是位移么,你们都是第一列到第二列怎么来的,为什么不考虑怎么从第三列演变成第一列和第二列?
另外虽然第三列一直是-1,但我也说他不是静止的,难道你们都没发现规律?
而问号处,其实可以放4种,+ ^ | ~(但这个~有点限制),但要考虑为什么会这样子,为什么&不行。这有助于分析什么情况下更适合用什么运算符。
本题的这张图,我不知道你们有没有仔细考虑过,像不像一些网站的相册上切换照片时的特效剪切?第一列从上往下,第二列从下往上?而本题由于是位运算,并且运算方面效率不错,再加上可以指定任意行,所以用来处理图像剪切的特效时是很有用处的。这个大家可以试验下,每次32行,逐行取,并把该剪切窗格布满整个图像,下方放上下一张图片,然后用setclip根据每一行的数字来切窗口,最后只完整的显示下一张图。当然这种方法并不是很好,但你应该试着尝试把所学到的知识加以利用。- //这个足够看出来3种位移方式的区别了
- //至于?的运算符,+ ^ |三种都行
- for (int shift = 1; shift < Integer.SIZE; shift++)
- {
- System.out.print(getIntegerToBinary(-1 << shift));
- System.out.print(" ? " + getIntegerToBinary(-1 >>> Integer.SIZE - shift));
- System.out.println(" = " +getIntegerToBinary(-1 >> shift));
-
- }
复制代码 这里边的 getIntegerToBinary 方法我在第五题的答案里已经写过了,就不在这发占篇幅了。这里有个小知识点,是第五题没有说的,-1 变31 -2变30,用32加上去就行,但局限性很大,不支持32+以后的情况。- for (int shift = 1; shift < Integer.SIZE; shift++)
- {
- System.out.print(getIntegerToBinary(-1 << shift));
- System.out.print(" ? " + getIntegerToBinary(-1 >>> shift));
- System.out.println(" = " +getIntegerToBinary(-1 >> shift));
-
- }
复制代码 对比下两个变形,如果根据这个代码的图,第二列不变,而改动第一列应该怎么办?
|