按位操作检查字符串是唯一的

时间:2015-08-24 02:11:30

标签: java string bit-manipulation

这是检查输入字符串是否唯一的代码。 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

3 个答案:

答案 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设置了相关位,如果是,&该字符串不仅包含唯一字符。

您可能希望查看有关按位运算符和位移操作的使用和功能的帖子。