Re: [問題] <<和|=的意思

看板java作者 (十三)時間11年前 (2014/03/06 09:32), 編輯推噓2(204)
留言6則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《yule1224 (我是B型)》之銘言: : 現在在看Cracking The Coding Interview : 裡面一段java看不太懂 : 1<<val 是不是指 val所有位元向左邊移一個位子,然後最右邊的放入0 : 為什麼要用(1<<val)>0 來當做檢驗字母有沒有重複的其中一項因素呢? : 還有我也看不太懂 checker |=(1<<val); : 這個程式是用來判斷string裡的字母是不是都不相同 題外:就程式寫法,這個字串應該只有小寫字母。 正題: checker在x86理應是4 bytes,32 bits。 初始化為0代表所有bits都沒有設立。 先把他想成一個32個欄位全部都是0的array。 程式做法: 每每碰到一個字串裡的字元,先檢查在array相應的欄位是否有值為1, 如果有值代表重複, 沒有值的話那我就在相應的欄位設定值1(下一次碰到一樣字元就知道重複)。 array的想法你能接受的話,就可以轉換來想checker。 : public boolean isUniqueChars(String str){ : if (str.length()> 256) return false; : int checker = 0; : for (int i=0; i<str.length(); i++){ : int val=str.charAt(i) - 'a'; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ checker有32個位置, 如果此字串都只有英文小寫字母,那減去'a'知後val頂多是0 ~ 25 : if((checker & (1<<val))>0{ 1 << val 為 位於bit0的1移位到第val位,也就是設定第val欄位為1。 checker 做 & 運算會大於0, 表示checker的第val欄位已經被設定(因為true and true 為 true),代表重複。 如果checker的第val欄位沒有被設定,那麼 & (1<<val)就不會大於0 : return false; : } : checker |= (1<<val); 因為不會大於0,代表第一次出現,那麼用 checker = checker | (1 << val); 來設定表示第val欄位的字元已經出現過。 : } : return true; : } : 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.63.96.2

03/06 09:41, , 1F
大寫也可以, A到a剛好差32
03/06 09:41, 1F

03/06 13:57, , 2F
哪來可以啊... B不就overflow了...
03/06 13:57, 2F

03/06 13:59, , 3F
另外 大寫減小寫的話是負值好嗎...
03/06 13:59, 3F

03/07 01:26, , 4F
抱歉我寫錯了 是要判斷不同的char 不是字母 :P
03/07 01:26, 4F

03/07 01:28, , 5F
所以一開始就用 str.length()>256 來判斷是否有重複
03/07 01:28, 5F

03/07 01:30, , 6F
你解釋的很詳盡 我懂了 謝謝
03/07 01:30, 6F
文章代碼(AID): #1J5z0G3O (java)
文章代碼(AID): #1J5z0G3O (java)