Cranking the Coding Interview: Bit Manipulation

本文介绍了几种常见的位操作技巧及其应用场景,包括将一个数的指定位插入另一个数、转换实数为二进制字符串、计算两个整数间的位变化数量以及交换数的奇偶位。这些技巧对于理解底层数据处理和提高编程效率至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Insertion

有两个32位整数n和m,请编写算法将m的二进制数位插入到n的二进制的第j到第i位,其中二进制的位数从低位数到高位且以0开始。
给定两个数int n和int m,同时给定int j和int i,意义如题所述,请返回操作后的数,保证n的第j到第i位均为零,且m的二进制位数小于等于i-j+1。
测试样例:

1024,19,2,6

返回:1100

代码实现:

class BinInsert {
public:
    int binInsert(int n, int m, int j, int i) {
        // write code here
        int ins = m << j;
        return n & (~((unsigned(0xffffffff) >> (31 - i + j)) << j)) | ins; 
    }
};

Binary to String

有一个介于0和1之间的实数,类型为double,返回它的二进制表示。如果该数字无法精确地用32位以内的二进制表示,返回“Error”。

给定一个double num,表示0到1的实数,请返回一个string,代表该数的二进制表示或者“Error”。

测试样例:
0.625

返回:0.101

代码实现:

class BinDecimal {
public:
    string printBin(double num) {
        // write code here
        if(num == 0) return "0.0";
        if(num == 1) return "1.0";
        string res = "0.";
        double bin = 0.5;
        while(num > 0) {
            res += num - bin >= 0 ? '1':'0';
            num = (num - bin >= 0)?num - bin:num;
            bin /= 2.0;
            if(res.size() > 34) return "Error";
        }
        return res;
    }
};

Conversion

编写一个函数,确定需要改变几个位,才能将整数A转变成整数B。
给定两个整数int A,int B。请返回需要改变的数位个数。

测试样例:
10,5

返回:4

代码实现:

class Transform {
public:
    int calcCost(int A, int B) {
        // write code here
        int res = 0;
        for(int i = 0; i < 32; i++) {
            res += ((A ^ B) & 1);
            A = A >> 1;
            B = B >> 1;
        }
        return res;
    }
};

当然也可以写成:

class Transform {
public:
    int calcCost(int A, int B) {
        // write code here
        int res = 0;
        for(int i = 0; i < 32; i++) 
            res += (((A >> i) ^ (B >> i)) & 1);
        return res;
    }
};

Pairwise Step

请编写程序交换一个数的二进制的奇数位和偶数位。(使用越少的指令越好)
给定一个int x,请返回交换后的数int。

测试样例:
10

返回:5

class Exchange {
public:
    int exchangeOddEven(int x) {
        // write code here
        int pre = 0;
        for(; pre < 32; pre+=2) {
            int xor_pre = ((x >> pre) ^ (x >> (pre+1))) & 1;
            x = ((xor_pre << pre) ^ x);
            x = ((xor_pre << (pre+1)) ^ x);
        }
        return x;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值