190 顛倒二進制位
顛倒給定的 32 位無符號整數(shù)的二進制位。
提示:
請注意,在某些語言(如 Java)中,沒有無符號整數(shù)類型。在這種情況下,輸入和輸出都將被指定為有符號整數(shù)類型,并且不應(yīng)影響您的實現(xiàn),因為無論整數(shù)是有符號的還是無符號的,其內(nèi)部的二進制表示形式都是相同的。
在 Java 中,編譯器使用二進制補碼記法來表示有符號整數(shù)。因此,在 示例 2 中,輸入表示有符號整數(shù) -3,輸出表示有符號整數(shù) -1073741825。
示例 1:
輸入:n = 00000010100101000001111010011100
輸出:964176192 (00111001011110000010100101000000)
解釋:輸入的二進制串 00000010100101000001111010011100 表示無符號整數(shù) 43261596,
因此返回 964176192,其二進制表示形式為 00111001011110000010100101000000。
示例 2:
輸入:n = 11111111111111111111111111111101
輸出:3221225471 (10111111111111111111111111111111)
解釋:輸入的二進制串 11111111111111111111111111111101 表示無符號整數(shù) 4294967293,
因此返回 3221225471 其二進制表示形式為 10111111111111111111111111111111 。
提示:
輸入是一個長度為 32 的二進制字符串
來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/reverse-bits文章來源:http://www.zghlxwxcb.cn/news/detail-567415.html
解決方案:
提供思路
1)最直觀的做法是依次遍歷 n 的二進制表示的每一位,對于 0≤i<32,n 的二進制表示的從低到高第 i 位在顛倒二進制位之后是從低到高第 31?i 位。
2)解法一需要遍歷整數(shù) n 的二進制表示的每一位,這道題存在時間復雜度更低的分治解法。
將整數(shù) n 的二進制位分組顛倒。初始時 n 分成 32 組,每組有 1 位。當 n 的分組個數(shù)大于 1 時,每次將 n 的相鄰兩組互換,互換之后這兩組合并為一個組,直到 n 的分組個數(shù)等于 1 時結(jié)束。分組情況具體變化如下。
1 16 組,每組有 2 位。
2 8 組,每組有 4 位。
4 組,每組有 8 位。
2 組,每組有 16 位。
1 組,每組有 32 位。
上代碼:
//1
public class Solution
{
public uint reverseBits(uint n)
{
const int BITS = 32;
uint reversed = 0;
for (int i = 0, j = BITS - 1; i < BITS; i++, j--)
{
uint bit = (n >> i) & 1;
reversed |= bit << j;
}
return reversed;
}
}
//2
public class Solution
{
public uint reverseBits(uint n)
{
n = (n & 0x55555555) << 1 | (n >> 1) & 0x55555555;
n = (n & 0x33333333) << 2 | (n >> 2) & 0x33333333;
n = (n & 0x0f0f0f0f) << 4 | (n >> 4) & 0x0f0f0f0f;
n = (n << 24) | ((n & 0xff00) << 8) | ((n >> 8) & 0xff00) | (n >> 24);
return n;
}
}
個人感悟:這題沒太懂,參考給出的結(jié)果,有需要的話可以強行背誦。
以上是碰到的第一百九十題,后續(xù)持續(xù)更新。感覺對你有幫助的小伙伴可以幫忙點個贊噢!文章來源地址http://www.zghlxwxcb.cn/news/detail-567415.html
到了這里,關(guān)于C# 顛倒二進制位的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!