所以我在
的界限上看到了这个问题编写一个计算字符中位数的函数
现在很明显这让我很困惑(或者我不会在这里)。
我的第一个想法是“默认情况下不是全部char
16位?”但显然这是错误的,因为这个问题存在。我不知道从哪里开始。也许我可以获得char的十六进制值?有没有一种从十六进制转换为二进制或其他东西的简单方法?这是可以被问及任何语言的东西(我在这里对Java感到好奇)还是仅仅喜欢C或其他东西?
答案 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字符。