国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

筆試面試中涉及位運(yùn)算的題目總結(jié)(一)

2019-11-10 17:45:39
字體:
供稿:網(wǎng)友
題目一:

題目描述

有一個(gè)正整數(shù),請(qǐng)找出其二進(jìn)制表示中1的個(gè)數(shù)相同、且大小最接近的那兩個(gè)數(shù)。(一個(gè)略大,一個(gè)略小)

給定正整數(shù)int x,請(qǐng)返回一個(gè)vector,代表所求的兩個(gè)數(shù)(小的在前)。保證答案存在。

測試樣例:
2返回:[1,4]題目分析:     對(duì)于這道題目,我覺得最重要的就是求一個(gè)數(shù)的二進(jìn)制表示中1的個(gè)數(shù)。關(guān)于求一個(gè)數(shù)的二進(jìn)制表示中1的個(gè)數(shù)會(huì)有很多種方法:方法1:與1求&運(yùn)算,依次求出32個(gè)比特位中1的個(gè)數(shù)。(效率較低,無論多大的數(shù),都要循環(huán)32次)方法2:平行算法:相鄰的比特位求和,重復(fù)這個(gè)過程,直到最后只剩下一個(gè)位,就是該數(shù)的二進(jìn)制表示中1的個(gè)數(shù)。方法3:快速法,任何數(shù)和比它小1的數(shù)做&運(yùn)算,結(jié)果都會(huì)比原來的數(shù)少一個(gè)1,這樣也是可以統(tǒng)計(jì)出1的個(gè)數(shù)。由于這是一種比較快速的方法,所以下面會(huì)使用這種辦法來求取1的個(gè)數(shù)。【注意】

     很多初學(xué)者,對(duì)于這個(gè)問題還會(huì)想到模除的辦法,但是模除這個(gè)方法,處理正數(shù)的時(shí)候沒有什么問題,但是處理負(fù)數(shù)的時(shí)候,就不對(duì)了,下邊給出測試代碼:

void test(){       int x = -1;       int count = 0;       while (x)       {              if (x % 2 != 0)                     ++count;              x /= 2;       }       cout << count << endl;}

而實(shí)際上,-1的二進(jìn)制表示中含有32個(gè)1.所以,這種辦法就是錯(cuò)誤的。好了,說了這么多,重點(diǎn)還是解決本題。下邊給出本題的實(shí)現(xiàn)代碼:實(shí)現(xiàn)代碼:
class CloseNumber {public:    int Count(int x)    {        int count = 0;        while (x)        {            ++count;            x = x & (x - 1);        }        return count;    }    vector<int> getCloseNumber(int x) {        // write code here        int countOne = Count(x);        vector<int> ret;        for (int i = x - 1; i > 0; --i)        {            if (Count(i) == countOne)            {                ret.push_back(i);                break;            }           }        for (int i = x + 1; ;++i)        {            if (Count(i) == countOne)            {                ret.push_back(i);                break;            }        }        return ret;    }};題目二:

題目描述

請(qǐng)編寫程序交換一個(gè)數(shù)的二進(jìn)制的奇數(shù)位和偶數(shù)位。(使用越少的指令越好)

給定一個(gè)int x,請(qǐng)返回交換后的數(shù)int。

測試樣例:
10返回:5題目分析:如果我們可以得到一個(gè)數(shù)的奇數(shù)位和偶數(shù)位的值,然后進(jìn)行交換就可以了。得到奇數(shù)位的值和偶數(shù)位的值是比較簡單的。奇數(shù)位的值:給定數(shù)字&0xAAAAAAAA偶數(shù)位的值:給定數(shù)字&0x55555555交換的方法:奇數(shù)位的值右移一位,偶數(shù)位的值左移一位,兩者相加,得到結(jié)果。代碼實(shí)現(xiàn):
class Exchange {public:    int exchangeOddEven(int x) {        // write code here        int odd = (x & 0xAAAAAAAA);//換取x的奇數(shù)位信息        int even = (x & 0x55555555);//偶數(shù)位信息        return (odd >> 1) + (even << 1);    }};題目三:

題目描述

有一個(gè)介于0和1之間的實(shí)數(shù),類型為double,返回它的二進(jìn)制表示。如果該數(shù)字無法精確地用32位以內(nèi)的二進(jìn)制表示,返回“Error”。

給定一個(gè)double num,表示0到1的實(shí)數(shù),請(qǐng)返回一個(gè)string,代表該數(shù)的二進(jìn)制表示或者“Error”。

測試樣例:
0.625返回:0.101題目分析:這個(gè)題目考查十進(jìn)制的小于1的正小數(shù)轉(zhuǎn)為二進(jìn)制數(shù)的辦法,這個(gè)學(xué)過計(jì)算機(jī)基礎(chǔ)的人都會(huì)轉(zhuǎn)化,就是連乘法,這里就不細(xì)說了。特別需要注意的是,浮點(diǎn)數(shù)與0進(jìn)行比較的方法,這個(gè)問題,前邊的文章也是總結(jié)過的。即就是這個(gè)數(shù)在無限接近于0的正小數(shù)和負(fù)小數(shù)之間,則就認(rèn)為是為0.具體請(qǐng)看下邊代碼中的表示方法。代碼實(shí)現(xiàn):
class BinDecimal {public:#define exp pow(10,-7)    string PRintBin(double num) {        // write code here        string ret;        if (num >= 1)            return ret;        int count = 0;        ret.push_back('0');        ret.push_back('.');        while (!(num > -exp && num < exp))        {            num = num * 2;            if (num >= 1.0)            {                ++count;                ret.push_back('1');                num -= 1.0;            }               else            {                ++count;                ret.push_back('0');            }            if (count == 32){              return "Error";            }        }        return ret;    }};【總結(jié)】1.浮點(diǎn)數(shù)與0進(jìn)行比較的方法,不可直接比較。2.十進(jìn)制小數(shù)轉(zhuǎn)換成二進(jìn)制小數(shù)的方法-----連乘法。3.一個(gè)數(shù)的二進(jìn)制表示中1的個(gè)數(shù)。4.如何得到一個(gè)數(shù)的奇數(shù)位和偶數(shù)位對(duì)應(yīng)的值---將數(shù)字和0xAAAAAAAA按位與,和0x55555555按位與。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 合川市| 嘉荫县| 咸丰县| 武夷山市| 定安县| 曲沃县| 长治市| 岳阳县| 金川县| 右玉县| 册亨县| 青冈县| 汶上县| 汪清县| 师宗县| 齐齐哈尔市| 精河县| 八宿县| 拉萨市| 泰来县| 宣威市| 额敏县| 贵德县| 肃北| 承德市| 昆山市| 辽阳市| 阳泉市| 滦平县| 钦州市| 巩义市| 通化县| 五常市| 勐海县| 望江县| 静宁县| 东乡族自治县| 商南县| 临潭县| 什邡市| 新营市|