這幾天擼了一下位運算。
寫個筆記總結一下。
首先運算了解一下。
& : 按位與
| : 按位或
^ : 按位異或
~ : 取反
<< : 左移 >> : 右移
這一題,我們本來可以不停除2,看最後是否等於1
但是掌握了上面我們說的思想以後。
就直接簡單了。只需要兩行**。
class solution
}
因為如果是2的冪 那麼它的二進位制必定只有乙個1.
去掉了最後乙個1,那麼就只能是0了。
不同於上一題,這是4的冪。
那麼觀察一下,4的冪也只有1個1,但是每乙個1都必定在二進位制的奇數字上。
偶數字必須是0.
那麼我給你乙個數。
1010101010101010101010101010101
這個數嚴格滿足了上面的條件。
那麼將乙個4的冪的數,與這個數,按位與。會怎麼樣?
答案是不會怎麼樣。
我們稱4的冪為x,x的二進位制只有乙個1,並且在奇數字。這個數所有的奇數字都是1,而偶數字都是0,那麼兩數經過&, 1&1還是1,0&0還是0,1&0還是0,所以根本不會變化。
反之 如果它不是4的冪,如果是2的冪 那麼在偶數上是1,但是那個數的偶數上是0,即1&0為0
則變化了,不再是原來那個數。
所以與1010101010101010101010101010101經過按位與而不變的數,一定是4的冪。
1010101010101010101010101010101的16進製制寫法為0x55555555。
class solution
}
要求線性。
int missingnumber(int* nums, int numssize)
for(i = 0; i < numssize; i ++)
} return i;
}
以前我是這麼寫的。
ac了。效率可以說還不錯。
現在可以用異或
class solution
}
當然還有高斯求和公式的數學解法。更妙。
我複製了官解。
class solution
}
類似的一題。
389. 找不同
給定兩個字串 s 和 t,它們只包含小寫字母。
字串 t 由字串 s 隨機重排,然後在隨機位置新增乙個字母。
請找出在 t 中被新增的字母。
class solution
for(character x : t.tochararray())
return (char) res;
}}
最後看一題,我覺得很不錯的題目。
318. 最大單詞長度乘積
如果不用位運算還真是有點麻煩。
那用位運算該怎麼寫呢?
因為題目規定必須沒有公共字母。就可以很容易想到按位與&。
不同的字母按位與必須是0。相同則為0 .
那麼可不可以這樣表示。
「abc」 為 00000000 00000000 00000000 00000111.
"bc"為00000000 00000000 00000000 00000110.
"abcde"為00000000 00000000 00000000 00011111.
有就用1來表示。
那麼abc & bc 必定是00000000 00000000 00000000 00000111
如果ab & c 就是00000000 00000000 00000000 00000000
無公共就是0.
class solution
}int max = 0;
for(int i = 0; i < words.length; i ++)
}return max;
}}
前路漫漫啊。還有很多需要去學習呢。 位運算筆記
10 1010 12 1100 與例如 以下按位比較,當兩個同時為1則為1,否則為0 10 1010 12 1100 結果為 8 1000 或例如 以下按位比較,當兩個有任何乙個為1則為1,否則為0 10 1010 12 1100 結果為 14 1110 非例如 以下按位比較,當兩個數不同時則為1否...
筆記 位運算
1 格式 x y 2 規則 對應位均為1時才為1,否則為0。例如,3 9 1 0011 1001 0001 3 主要用途 取 或保留 1個數的某些位,其餘各位置0。1 格式 x y 2 規則 對應位均為0時才為0,否則為1 3 9 11。例如,3 9 11 0011 1001 1011 3 主要用途...
位運算筆記
需要掌握的知識 原碼 反碼 補碼 原碼 是最簡單的機器數表示法。用最高位表示符號位,1 表示負號,0 表示正號。其他位存放該數的二進位制的絕對值。1010 最高位為 1 表示這是乙個負數,其他三位為 010 即 0 2 2 1 2 1 0 20 2 表示冪運算子 所以1010表示十進位制數 2 面臨...