Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算字符中的设置位_Java_Character_Bit - Fatal编程技术网

Java 计算字符中的设置位

Java 计算字符中的设置位,java,character,bit,Java,Character,Bit,所以我在互联网上看到了一个问题,这个问题与 编写一个计算字符位数的函数 很明显,这让我很困惑(否则我就不会在这里了) 我的第一个想法是“难道不是所有的chars默认值都是16位吗?”但显然这是错误的,因为这个问题存在。我不知道从哪里开始。也许我能得到字符的十六进制值?有没有一种简单的方法可以将十六进制转换成二进制或其他形式?这是关于任何语言都可以问到的问题(我对这里的Java很好奇),还是只喜欢C或其他东西才重要?所有字符在C中都是1字节,Unicode(TCHAR)字符是2字节 要计算位,需要

所以我在互联网上看到了一个问题,这个问题与

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

很明显,这让我很困惑(否则我就不会在这里了)


我的第一个想法是“难道不是所有的
char
s默认值都是16位吗?”但显然这是错误的,因为这个问题存在。我不知道从哪里开始。也许我能得到字符的十六进制值?有没有一种简单的方法可以将十六进制转换成二进制或其他形式?这是关于任何语言都可以问到的问题(我对这里的Java很好奇),还是只喜欢C或其他东西才重要?

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


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

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


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

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


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

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


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

根据OracleJavadocforPrimitives


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

根据Oracle JAVA doc for primitives


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

根据Oracle JAVA doc for primitives


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

根据Oracle JAVA doc for primitives


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

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

public static int bitsSet(char arg) {
    return arg == 0 ? 0 : (arg & 1) + bitsSet((char)( arg >>> 1 ));
}
是的,Java中所有的
char
s都是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  

我从你的标题中假设你追求的是“设定位”的数量(即等于1的位)。你可以这样做

public static int bitsSet(char arg) {
    return arg == 0 ? 0 : (arg & 1) + bitsSet((char)( arg >>> 1 ));
}
是的,Java中所有的
char
s都是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  

我从你的标题中假设你追求的是“设定位”的数量(即等于1的位)。你可以这样做

public static int bitsSet(char arg) {
    return arg == 0 ? 0 : (arg & 1) + bitsSet((char)( arg >>> 1 ));
}
是的,Java中所有的
char
s都是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  

我从你的标题中假设你追求的是“设定位”的数量(即等于1的位)。你可以这样做

public static int bitsSet(char arg) {
    return arg == 0 ? 0 : (arg & 1) + bitsSet((char)( arg >>> 1 ));
}
是的,Java中所有的
char
s都是16位

更新

这里有一点解释
(arg&1)
将检查
arg
的最右边的位,并根据是否清除或设置返回0或1。所以我们想要取0或1,并将其添加到最左边的15位中的设置位数。为了解决这个问题,我们向右移动
arg
,在左端引入一个零。我们需要
>>
而不是
>
来确保在