这是检查输入字符串是否唯一的代码。 Line no正在做什么11:check |=(1<<val)
为什么支票的二进制形式如此?
public boolean checkUnique(String str)
{
int check=0;
for(int i=0; i<str.length();i++)
{
int val = str.charAt(i)-'a';
if((check & (1 << val)) >0)
{
return false;
}
check |= (1<<val);
System.out.println("check "+Integer.toBinaryString(check));
}
return true;
}
I/P : "asdfgh"
O/P () :
0
check 1
18
check 1000000000000000001
3
check 1000000000000001001
5
check 1000000000000101001
6
check 1000000000001101001
7
check 1000000000011101001
答案 0 :(得分:1)
此代码看起来就是检查字符串中每个字符是否唯一。
int check=0;
使用check
初始化“0
”;
int val = str.charAt(i)-'a';
ASCII字符的最大值为127,减去'a',即97,给出0到30之间的值; [注意,看起来这个函数只能检查高于或等于'a'的字符(97),否则,val可能会被分配一个负值,这对以后的按位移位操作没有意义。 / p>
对于第一次迭代,“if((check & (1 << val)) >0)
”总是假的,0&amp;任何int都将为0;
然后,行“check |= (1 < < val);
”左移位0x01,位数由'val'指定。例如,如果val = 3,则将(1 <&lt;&lt; val)评估为0x08。 0按位或使用0x08将'检查'值为0x08;
对于前面的迭代,每次都会生成一个新的'val',并且'if'子句按位使用 - 并检查'val'是否已经存在。如果存在,则返回false函数,否则,在“check”中“记录”新的'val'并继续下一次迭代。循环结束后,返回true。
答案 1 :(得分:1)
简单的答案是,check |= (1<<val)
表示:&#34;在位置val&#34;处存储1。
行(check & (1 << val)) >0
表示:&#34;在位置val&#34;是否有1。
行val = str.charAt(i)-'a'
表示:&#34;为(小写)字母表中的每个字母分配一个唯一的val&#34;
这仅适用于大小等于或小于31个字母的字母,因为这是int值中不是负数的位数。
答案 2 :(得分:0)
for (PayloadType pt : mLc.getAudioCodecs()) {
pt = mLc.findPayloadType("PCMA", 8000, 1);
Log.d("LinphoneManager", "PayloadType PCMA : " + pt);
}
for (PayloadType pt : mLc.getAudioCodecs()) {
pt = mLc.findPayloadType("PCMU", 8000, 1);
Log.d("LinphoneManager","PayloadType PCMU : "+pt);
}
for (PayloadType pt : mLc.getAudioCodecs()) {
pt = mLc.findPayloadType("OPUS", 8000, 1);
Log.d("LinphoneManager","PayloadType P : "+pt);
}
是包含OR运算符。 |
将包含OR运算的结果分配给指示的变量。 |=
是左移位运算符。它将二进制数据“向左”移动指定的位数。
第11行正在分配包含OR运算的结果,即左移第1个数字<<
位数。
从我看到的,目的是确定val
变量是否已经通过第7行的AND运算符check
设置了相关位,如果是,&
该字符串不仅包含唯一字符。
您可能希望查看有关按位运算符和位移操作的使用和功能的帖子。