计算字符中的设置位

时间:2014-01-30 03:07:13

标签: java character bit

所以我在

的界限上看到了这个问题
  

编写一个计算字符中位数的函数

现在很明显这让我很困惑(或者我不会在这里)。

我的第一个想法是“默认情况下不是全部char 16位?”但显然这是错误的,因为这个问题存在。我不知道从哪里开始。也许我可以获得char的十六进制值?有没有一种从十六进制转换为二进制或其他东西的简单方法?这是可以被问及任何语言的东西(我在这里对Java感到好奇)还是仅仅喜欢C或其他东西?

4 个答案:

答案 0 :(得分:2)

如果你想避免递归,这是另一种方法。

public static int bitsSet(char arg) {
    int counter = 0;
    for (int oneBit = 1; oneBit <= 0x8000; oneBit <<= 1) {
        if ((arg & oneBit) > 0) {
            counter++;
        }
    }
    return counter;
}

<强>更新

这是一个解释。在循环中,每次oneBit向左移位,使其值加倍。 <<=操作是oneBit = oneBit << 1的一种简写。所以,第一次,我们有oneBit = 0000000000000001。接下来,我们有oneBit = 0000000000000010,然后是oneBit = 0000000000000100,依此类推,直到我们到达最后一次迭代,当我们有oneBit = 1000000000000000时(当然这些都是二进制)。

现在,如果arg & oneBit设置了匹配位,则oneBit的值将等于arg,否则为0。因此,如果遇到设置位,则条件正在执行counter++。当循环全部运行16次时,我们计算了所有设置位。

答案 1 :(得分:1)

我从你的标题中假设你是在“设置位”的数量之后(即,等于1的位)。你可以这样做。

public static int bitsSet(char arg) {
    return arg == 0 ? 0 : (arg & 1) + bitsSet((char)( arg >>> 1 ));
}

是的,Java中的所有char都是16位。

<强>更新

这是一个解释。 (arg & 1)将检查arg的最右边位并返回0或1,具体取决于它是清除还是设置。所以我们想要取0或1,并将其添加到最左边的15位中的设置位数。因此,为了解决这个问题,我们将arg向右移动,在左端引入零。我们需要>>>而不是>>来确保我们在左端得到零。然后我们再次调用bitsSet,使用右移值arg

但每次我们这样做,arg变小,所以最终它会达到零。当发生这种情况时,不再设置位,因此我们可以返回0。

要查看递归工作,请参考arg = '%' = 100101。然后我们有以下内容 - 显示的所有数字都是二进制 -

  bitsSet(100101) 
= (100101 & 1) + bitsSet(10010))  
= (100101 & 1) + (10010 & 1) + bitsSet(1001)  
= (100101 & 1) + (10010 & 1) + (1001 & 1) + bitsSet(100)  
= (100101 & 1) + (10010 & 1) + (1001 & 1) + (100 & 1) + bitsSet(10)  
= (100101 & 1) + (10010 & 1) + (1001 & 1) + (100 & 1) + (10 & 1) + bitsSet(1)  
= (100101 & 1) + (10010 & 1) + (1001 & 1) + (100 & 1) + (10 & 1) + (1 & 1) + bitsSet(0)
=       1      +      0      +     1      +     0     +    0     +    1    +     0
= 3  

答案 2 :(得分:0)

所有字符在C中都是1字节,Unicode(TCHAR)字符是2字节。

要对位进行计数,您需要进行位移。我个人并不擅长二进制算术。

答案 3 :(得分:0)

根据Oracle JAVA doc for primitives。

char:char数据类型是一个16位Unicode字符。