浏览 4338 次
锁定老帖子 主题:Java位操作的演示例子
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-12
问题:
大厅里有64盏灯,每盏灯都编了号码,分别为1-64。每盏灯都由一个开关来控制。(开关按一下,灯亮,再按一下灯灭。开关的编号与被控制的灯相同。)开始时,灯是全灭的。现在按照以下规则按动开关。
提示:用一个long来表示64盏灯,long有64位,每个位上只能取值0和1,可以选择取1表示灯亮,取0表示灯灭; 大家在看答案之前,可以自行思考一下 :)
参考实现代码: public static void main(String[] args) { int max = 4; long light = 0; for(int n=1; n <= max; n++){ for(int i=1; i<=64 ; i++){ //i代表了灯/开关的编号,需要将n的倍数所在的位取反 //比如:n=1,那么,需要将1,2,3,4,5...这些位取反 //n=2,需再将2,4,6,8,10...这些位取反 //n=3,需再将3,6,9,12,15...这些位取反 if(i % n == 0){ //将i那一位取反 //如何将某一位取反呢?没有直接将某一位取反的现成的操作, //那么,我们可以判断此位的值是1还是0,然后据此,将此位改成0或1 //接下来的问题就是如何判断某位的值?如何将此为改成0或1? long temp = 1; temp = temp << (i - 1); if((temp & light) == 0){ //表示i这一位为0 //需将此位改成1 light = light | temp; }else{ //表示i这一位为1 //需将此位改成0 temp = ~temp; light = light & temp; } } } } //现在的light值,在某一位上如果取值为0表示灯灭,某一位上如果取值为1表示灯亮 //下面输出结果 int total = 0; //总共亮灯的数量 for(int i=0; i<64; i++){ long temp = 1; temp = temp << i; temp = temp & light; if(temp == 0){ //灯灭 System.out.println("【"+(i+1)+"】号灯:灭"); }else{ //灯亮 System.out.println("【"+(i+1)+"】号灯:亮"); total = total + 1; } } System.out.println("在经过【"+max+"】次之后,总共有【"+total+"】盏灯是亮的!"); }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-03-15
第一次沙发,哈哈,学习了,谢谢楼主,之前学习java一直不是很明白java关于位运算应该应用到何处,今天看到此DEMO豁然开朗。
|
|
返回顶楼 | |
发表时间:2010-03-15
极度反感在在一个面向的语言里,执行位运算...
位运算不是面向对象的.... 如果要需要位运算来加强效率,也许考虑用C做开发会更好 |
|
返回顶楼 | |
发表时间:2010-03-15
剩下的是 64以内的素数 这是一个很经典的 求素数的算法
|
|
返回顶楼 | |
发表时间:2010-03-15
其实我觉得可以把问题简单化一点,每次按灯的时候就是把上次的状态改成相反的,所以可以开始把所有的灯的状态记录下来,每次操作的时候直接改变状态位,我对移位操作也不是很熟悉,用的也少,直接用大家都能想到的方法。
public static void test(int n){ long start = System.currentTimeMillis() ; List<Integer> list = new ArrayList<Integer>() ; for(int k=0;k<64;k++){ list.add(0) ; //初始化都关着的 0表示关,1表示亮 } for(int i=1;i<=n;i++){ for(int j=1;j<=64;j++){ if(j%i==0){ list.set(j-1, ~(Integer.parseInt((list.get(j-1).toString())))) ; //直接取反 } } } int c =0 ; for(int s=0;s<list.size();s++){ if(list.get(s).equals(0)){ System.out.println("第"+ (s+1) +"盏灯关着的"); }else{ System.out.println("第"+ (s+1) +"盏灯开着的"); c++ ; } } long end = System.currentTimeMillis() ; System.out.println("共消耗的时间:"+(end-start)+" 毫秒"); System.out.println("共有:"+c+"亮着"); } |
|
返回顶楼 | |
发表时间:2010-03-15
l101y1982j 写道 极度反感在在一个面向的语言里,执行位运算...
位运算不是面向对象的.... 如果要需要位运算来加强效率,也许考虑用C做开发会更好 谁规定的????? 现在很多权限管理都是用这种做法 |
|
返回顶楼 | |
发表时间:2010-03-15
确实,我有个项目的权限就是通过标志位来处理的,觉得还是很方便的!
|
|
返回顶楼 | |