我正在尝试比较两个位串并返回V表示TRUE而F表示False,如果其中任何一个位“打开”,但它似乎不起作用。
如果我输入1000和0000,它会产生V F F F
,这是正确的,但如果我输入1000和0001,它会返回V V V V
,我似乎无法找出原因。
我哪里出错?
public static String ou (String s1, String s2) {
String chaineOU = "";
char verifS1 = 0;
char verifS2 = 0;
for (int i = 0; i < s1.length(); i++){
verifS1 = s1.charAt(i);
for (int n = 0; n < s2.length(); n++){
verifS2 = s2.charAt(n);
}
if (verifS1 == '1' || verifS2 == '1'){
chaineOU = chaineOU + 'V';
} else {
chaineOU = chaineOU + 'F';
}
return chaineOU;
}
}
答案 0 :(得分:1)
你的内循环毫无意义。它会导致您只针对s1的所有字符检查s2的最后一个字符。
此外,您的return语句似乎位于错误的位置。它应该在循环之后。
摆脱内部循环并移动return语句:
for (int i = 0; i < s1.length(); i++){
verifS1 = s1.charAt(i);
verifS2 = s2.charAt(i);
if (verifS1 == '1' || verifS2 == '1'){
chaineOU = chaineOU + 'V';
}else{
chaineOu = chaineOU + 'F';
}
}
return chaineOU;
此代码假定s1
和s2
具有相同的长度。如果它们可能有不同的长度,您应该决定在这种情况下输出应该是什么,并更改代码以反映它。
答案 1 :(得分:1)
看起来你想要执行“位”的“OR”(读取代码,并考虑“chaineOU”在法语中意为“OR链”),在这种情况下你需要比较相同位,所以你想要一个循环而不是两个。
您还有从在循环中返回的问题。
试试这个:
public static String ou (String s1, String s2){
String chaineOU = "";
char verifS1 = 0;
char verifS2 = 0;
for (int i = 0; i < s1.length(); i++){
verifS1 = s1.charAt(i);
verifS2 = s2.charAt(i);
if (verifS1 == '1' || verifS2 == '1'){
chaineOU = chaineOU + 'V';
}else{
chaineOU = chaineOU + 'F';
}
}
return chaineOU;
}
你的测试用例是一个不幸的巧合。
顺便说一下,这段代码可以更简洁地重写为:
public static String ou (String s1, String s2){
String chaineOU = "";
for (int i = 0; i < s1.length(); i++)
chaineOU += s1.charAt(i) + s2.charAt(i) > 96 ? 'V' : 'F`;
return chaineOU;
}
请参阅live demo
这种简化来自以下观察结果:
char
变量char
是数字类型,可以是算术添加,字符'0'
是十进制48
,所以'0' + '0'
是96
。从逻辑上讲,如果任一字符为'1'
,则字符总和将超过96
,从而导致对任一字符'1'