作为练习,我必须将任何正则数转换为二进制数,然后还原为二进制数。我这样做了,但是现在我必须让程序计算倒排二进制数开头0的个数。我试着计算所有的0,但因为我只需要计算第一个1之前0的数量,我被卡住了。这是我目前所看到的:
import java.util.*;
class Main {
public static void main(String[] args) {
int woord = 20;
String bin = Integer.toBinaryString(woord);
String test = new StringBuilder(bin).reverse().toString();
System.out.println(test);
}
}
我怎么数0开始的时候倒二进制数?
实际上,如果这是练习:
- 输入一个数字作为
int
- 返回在它的末尾(在最后一个'1'位之后)的零的数量,当以位 查看该数字时
那你找错人了。
return Integer.numberOfTrailingZeroes(input)
是您需要的一行代码。毕竟,'在倒序数的开始处计数零'与'在原始数的末尾计数零'是相同的。
看看这个方法是如何实现的:
// HD, Figure 5-14
int y;
if (i == 0) return 32;
int n = 31;
y = i <<16; if (y != 0) { n = n -16; i = y; }
y = i << 8; if (y != 0) { n = n - 8; i = y; }
y = i << 4; if (y != 0) { n = n - 4; i = y; }
y = i << 2; if (y != 0) { n = n - 2; i = y; }
return n - ((i << 1) >>> 31);
直接从OpenJDK源代码文档,除了它也是一个热点内在候选。这段代码大概比您的尝试快几千倍,因为它不涉及任何字符串。
真正的问题是,这个问题试图测试什么:
- 如果是库知识和/或阅读文档的能力,那么正确的答案是
Integer.numberOfTrailingZeroes
。 - 如果你知道比特是什么以及如何操作它们(测试你对与,或,异或和左/右移位操作的知识),你或多或少写上面的实现。
- 如果只是"看看你能不能弄清楚",那么我敢打赌这个练习基本上是毫无意义的。
- 写它的人很有可能真的认为你会把你的数字翻转成一个二进制字符串,翻转字符,然后写一个计数循环。然而,这是一个糟糕的练习,因为你被要求以一种令人难以置信的迟钝和低效的方式去做某事。"处理位"的概念会让你使用按位运算。如果这是解释,谁写的练习可能应该更多的关注学习和教学上少很多。
在"1"并返回第一个元素的长度。
import java.util.*;
class Main {
public static void main(String[] args) {
int woord = 20;
String bin = Integer.toBinaryString(woord);
String test = new StringBuilder(bin).reverse().toString();
System.out.println(test);
String[] parsed = test.split("1");
System.out.println(parsed.length > 0 ? parsed[0].length() : "0");
}
}