a********3 发帖数: 14 | 1 “identify the number of 1s in an integer is odd or even” |
z****e 发帖数: 54598 | |
z****e 发帖数: 54598 | 3 java
public class Test {
public static boolean isOdd(int para){
String s = "" + para;
boolean result = false;
for(int i=0;i
if(s.charAt(i)=='1') result = (result==true ? false:true );
}
return result;
}
public static void main(String[] args){
System.out.println(Test.isOdd(32011));
}
} |
z*********8 发帖数: 2070 | 4 转成string的好处是?
【在 z****e 的大作中提到】 : java : public class Test { : public static boolean isOdd(int para){ : String s = "" + para; : boolean result = false; : for(int i=0;i: if(s.charAt(i)=='1') result = (result==true ? false:true ); : } : return result; : }
|
z****e 发帖数: 54598 | 5 循环好写啊
【在 z*********8 的大作中提到】 : 转成string的好处是?
|
n****n 发帖数: 117 | 6 因为赵老师不喜欢位操作。。。
【在 z*********8 的大作中提到】 : 转成string的好处是?
|
l*********8 发帖数: 4642 | 7 My two cents:
bool hasOddOnes(int n)
{
int k = sizeof(int) << 3;
while(k>>=1)
n ^= (n>>k);
return n & 1;
} |
l******d 发帖数: 530 | 8 难道有什么pitfall?如果是10进制数的话,不就是连续的除以10,看个位数是否为1,
直到最高位变成个位吗? |
b******t 发帖数: 965 | 9 当然是2进制了
【在 l******d 的大作中提到】 : 难道有什么pitfall?如果是10进制数的话,不就是连续的除以10,看个位数是否为1, : 直到最高位变成个位吗?
|
g*********e 发帖数: 14401 | 10 bool oddOnes(unsigned n){
int count=0;
while(n){
n=n & (n-1);
count++;
}
return count % 2;
} |
|
|
l******d 发帖数: 530 | 11 那就右移,比除以10更快
【在 b******t 的大作中提到】 : 当然是2进制了
|
l*********8 发帖数: 4642 | 12 your method is countOnes(n) % 2. When n has 32 ones, your iteration will
run 32 times.
【在 g*********e 的大作中提到】 : bool oddOnes(unsigned n){ : int count=0; : while(n){ : n=n & (n-1); : count++; : } : return count % 2; : }
|
h****e 发帖数: 928 | |
c****p 发帖数: 6474 | 14 int bits_odd_even(int x)
{
//int LEN = 8 * sizeof(x);
//int i;
unsigned n;
n = (unsigned) x;
n = ((n&0xaaaaaaaaU)>>1) ^ (n&0x55555555U);
n = ((n&0x44444444U)>>2) ^ (n&0x11111111U);
n = ((n&0x10101010U)>>4) ^ (n&0x01010101U);
n = ((n&0x01000100U)>>8) ^ (n&0x00010001U);
n = ((n&0x00010000U)>>16) ^ (n&0x00000001U);
return n & 1;
}
【在 a********3 的大作中提到】 : “identify the number of 1s in an integer is odd or even”
|
w****x 发帖数: 2483 | 15
我k, 转成string啊...
直接1左移32次计数再%2得了, 太tricky的想不出来啊
【在 z****e 的大作中提到】 : java : public class Test { : public static boolean isOdd(int para){ : String s = "" + para; : boolean result = false; : for(int i=0;i: if(s.charAt(i)=='1') result = (result==true ? false:true ); : } : return result; : }
|
r*****e 发帖数: 792 | 16 这个解法我当时在看了wiki的解释后的感觉就是有人真TMD聪明啊。
【在 c****p 的大作中提到】 : int bits_odd_even(int x) : { : //int LEN = 8 * sizeof(x); : //int i; : unsigned n; : n = (unsigned) x; : n = ((n&0xaaaaaaaaU)>>1) ^ (n&0x55555555U); : n = ((n&0x44444444U)>>2) ^ (n&0x11111111U); : n = ((n&0x10101010U)>>4) ^ (n&0x01010101U); : n = ((n&0x01000100U)>>8) ^ (n&0x00010001U);
|
N**********p 发帖数: 408 | 17 或者用xor
【在 g*********e 的大作中提到】 : bool oddOnes(unsigned n){ : int count=0; : while(n){ : n=n & (n-1); : count++; : } : return count % 2; : }
|
a********3 发帖数: 14 | 18 “identify the number of 1s in an integer is odd or even” |
z****e 发帖数: 54598 | |
z****e 发帖数: 54598 | 20 java
public class Test {
public static boolean isOdd(int para){
String s = "" + para;
boolean result = false;
for(int i=0;i
if(s.charAt(i)=='1') result = (result==true ? false:true );
}
return result;
}
public static void main(String[] args){
System.out.println(Test.isOdd(32011));
}
} |
|
|
z*********8 发帖数: 2070 | 21 转成string的好处是?
【在 z****e 的大作中提到】 : java : public class Test { : public static boolean isOdd(int para){ : String s = "" + para; : boolean result = false; : for(int i=0;i: if(s.charAt(i)=='1') result = (result==true ? false:true ); : } : return result; : }
|
z****e 发帖数: 54598 | 22 循环好写啊
【在 z*********8 的大作中提到】 : 转成string的好处是?
|
n****n 发帖数: 117 | 23 因为赵老师不喜欢位操作。。。
【在 z*********8 的大作中提到】 : 转成string的好处是?
|
l*********8 发帖数: 4642 | 24 My two cents:
bool hasOddOnes(int n)
{
int k = sizeof(int) << 3;
while(k>>=1)
n ^= (n>>k);
return n & 1;
} |
l******d 发帖数: 530 | 25 难道有什么pitfall?如果是10进制数的话,不就是连续的除以10,看个位数是否为1,
直到最高位变成个位吗? |
b******t 发帖数: 965 | 26 当然是2进制了
【在 l******d 的大作中提到】 : 难道有什么pitfall?如果是10进制数的话,不就是连续的除以10,看个位数是否为1, : 直到最高位变成个位吗?
|
g*********e 发帖数: 14401 | 27 bool oddOnes(unsigned n){
int count=0;
while(n){
n=n & (n-1);
count++;
}
return count % 2;
} |
l******d 发帖数: 530 | 28 那就右移,比除以10更快
【在 b******t 的大作中提到】 : 当然是2进制了
|
l*********8 发帖数: 4642 | 29 your method is countOnes(n) % 2. When n has 32 ones, your iteration will
run 32 times.
【在 g*********e 的大作中提到】 : bool oddOnes(unsigned n){ : int count=0; : while(n){ : n=n & (n-1); : count++; : } : return count % 2; : }
|
h****e 发帖数: 928 | |
|
|
c****p 发帖数: 6474 | 31 int bits_odd_even(int x)
{
//int LEN = 8 * sizeof(x);
//int i;
unsigned n;
n = (unsigned) x;
n = ((n&0xaaaaaaaaU)>>1) ^ (n&0x55555555U);
n = ((n&0x44444444U)>>2) ^ (n&0x11111111U);
n = ((n&0x10101010U)>>4) ^ (n&0x01010101U);
n = ((n&0x01000100U)>>8) ^ (n&0x00010001U);
n = ((n&0x00010000U)>>16) ^ (n&0x00000001U);
return n & 1;
}
【在 a********3 的大作中提到】 : “identify the number of 1s in an integer is odd or even”
|
w****x 发帖数: 2483 | 32
我k, 转成string啊...
直接1左移32次计数再%2得了, 太tricky的想不出来啊
【在 z****e 的大作中提到】 : java : public class Test { : public static boolean isOdd(int para){ : String s = "" + para; : boolean result = false; : for(int i=0;i: if(s.charAt(i)=='1') result = (result==true ? false:true ); : } : return result; : }
|
r*****e 发帖数: 792 | 33 这个解法我当时在看了wiki的解释后的感觉就是有人真TMD聪明啊。
【在 c****p 的大作中提到】 : int bits_odd_even(int x) : { : //int LEN = 8 * sizeof(x); : //int i; : unsigned n; : n = (unsigned) x; : n = ((n&0xaaaaaaaaU)>>1) ^ (n&0x55555555U); : n = ((n&0x44444444U)>>2) ^ (n&0x11111111U); : n = ((n&0x10101010U)>>4) ^ (n&0x01010101U); : n = ((n&0x01000100U)>>8) ^ (n&0x00010001U);
|
N**********p 发帖数: 408 | 34 或者用xor
【在 g*********e 的大作中提到】 : bool oddOnes(unsigned n){ : int count=0; : while(n){ : n=n & (n-1); : count++; : } : return count % 2; : }
|
o****d 发帖数: 2835 | 35 这个怎么解释?
【在 l*********8 的大作中提到】 : My two cents: : bool hasOddOnes(int n) : { : int k = sizeof(int) << 3; : : while(k>>=1) : n ^= (n>>k); : : return n & 1; : }
|
A*****i 发帖数: 3587 | 36 我次奥这个解法真的给跪了,要不是楼下有人说wiki能查到看一天也看不出为啥……
【在 c****p 的大作中提到】 : int bits_odd_even(int x) : { : //int LEN = 8 * sizeof(x); : //int i; : unsigned n; : n = (unsigned) x; : n = ((n&0xaaaaaaaaU)>>1) ^ (n&0x55555555U); : n = ((n&0x44444444U)>>2) ^ (n&0x11111111U); : n = ((n&0x10101010U)>>4) ^ (n&0x01010101U); : n = ((n&0x01000100U)>>8) ^ (n&0x00010001U);
|
y****n 发帖数: 743 | 37 public static int Even(UInt64 x)
{
x ^= x >> 32;
x ^= x >> 16;
x ^= x >> 8;
x ^= x >> 4;
x ^= x >> 2;
x ^= x >> 1;
return (int)x & 1;
} |
d**********x 发帖数: 4083 | 38 有两本书,一本是hacker's delight
另外一本是cs:app,第一章
【在 A*****i 的大作中提到】 : 我次奥这个解法真的给跪了,要不是楼下有人说wiki能查到看一天也看不出为啥……
|
t****t 发帖数: 6806 | 39 这个解法写得这么复杂是为了数1的个数用的(就近相加-->无进位干扰). 数奇偶的话直
接折半就可以了, 比这个快一点点.
【在 c****p 的大作中提到】 : int bits_odd_even(int x) : { : //int LEN = 8 * sizeof(x); : //int i; : unsigned n; : n = (unsigned) x; : n = ((n&0xaaaaaaaaU)>>1) ^ (n&0x55555555U); : n = ((n&0x44444444U)>>2) ^ (n&0x11111111U); : n = ((n&0x10101010U)>>4) ^ (n&0x01010101U); : n = ((n&0x01000100U)>>8) ^ (n&0x00010001U);
|