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
,在左端引入一个零。我们需要>>
而不是>
来确保在