由于原来的第二题可能有点不好理解,换个试试,上过初中的看不懂的自己撞墙去
第二个,集合
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楼是一个简单的用户权限实现,很基础的应用,真的权限机制比这个复杂太多。
//System.out.println(Integer.toBinaryString(Integer.MAX_VALUE));
for(long x=-2,y=1;x>=-2147483648 & y<=2147483647;x=x*2,y=y*2+1)
{
long z = x + y;
System.out.println(Integer.toBinaryString((int)(x))+"+"+Integer.toBinaryString((int)(y))+"="+Integer.toBinaryString((int)(z)));
class Test
{
public static void main(String[] args)
{
String s = "00000000000000000000000000000000";
int count = 1;
for(long x=-2;x>=-2147483648;)
{
System.out.println(Integer.toBinaryString((int)(x))+"+"+
s.substring(count)+Integer.toBinaryString((int)(~x))+"="+
Integer.toBinaryString((int)(~x+x)));
x=x*2 ;
count++;
}
}
}作者: 高云飞 时间: 2012-5-17 16:22 本帖最后由 高云飞 于 2012-5-17 17:08 编辑
int a = 1;
int b = ~a;
StringBuffer zeros = new StringBuffer ("00000000000000000000000000000000");
for (int i = 0; i < 31; i++) {
System.out.println(Integer.toBinaryString(b) + "^" + zeros.substring(i+1) + Integer.toBinaryString(a) + "=" + Integer.toBinaryString(a^b));
b = b << 1;
a = (a << 1) + 1;
}
终于用这种方式实现格式与题目一致了,本来想用格式控制字符串的,发现,实现起来太难了,没有实现的了。就用这种方法了。作者: 马浩 时间: 2012-5-17 18:10
class Lesson3
{
public static void main(String []args)
{
int x=-1;
int y=31;
for (int i=1;i<32 ;i++ )
{
int a=x<<i;
/**
* 第二个,集合
*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.必须详细写出解题思路,实现方法。去工作之后,你写的代码不是给你自己看的,是给别人看的,你不写设计思路,不写注释,你让人怎么看?
*
*思路 int变量的每位分别代表1到31个元素 由于这里只有0到31所以最低为代表0 最高位代表31 当那为为1代表这个集合里有这个数
*为0代表集合里没这个数
*集合A用int变量listA表示的话为每位都是1所以为-1
*集合B用int变量listB表示的话为5到11位
*求A和B的交际 就是listA&listB的结果位数为1的就是交际
*/
public class MyListDemo {
public static void main(String[] args) {
int listA=-1;
//集合b是5到11 所以我拿12位表示它 因为重0开始 由于这个集合头前五位是0
//地6为到12为1 用16进制表示为0xfe0我拿这个数|上0就是我要的数了
int listB=0|0xfe0;
//求listA与listB的交际 拿listA&上listB 定义一个int型变量存储交集
int jiaoJi=listA&listB;
//应为是交际而listB的元素是5到11所以取出6到12位中改位为1的数在-1即可
System.out.println("交集为:");
get(jiaoJi,6,12);
int bingJi=listA|listB;
//并集拿2个集合代表的数进行或运算就可以了 次数为大的集合1到32
System.out.println("并集为:");
get(bingJi,1,32);
System.out.println("补集为:");
//补集listA有的listB没有 ^是2进制位相同为0不同为1 应为listA所有位都是1所以不会
//出现listB有的listA没有
int buJi=listA^listB;
get(buJi,1,32);
//求给定集合 C{7,9} 是 A 和 B 哪个集合的子集
//先创建个c集合 每个16进制位代表4位
//集合c和集合A,B&操作 8到10位为1那么就是它的子集
int listC=0|0x380;
if (contains(listC&listA,8,10)){
System.out.println("listC是listA的子集");
}
if (contains(listC&listB,8,10)){
System.out.println("listC是listB的子集");
}