Bit Manipulation

来源:互联网 发布:淘宝直通车推广方案 编辑:程序博客网 时间:2024/05/16 05:04

From: career up 150.

1. Question:

Given an integer, print the next smallest and next largest number that have the same number of 1 bits in their binary representation.

Answer:

Number Properties Approach for Next Number
Observations:
»»If we “turn on” a 0, we need to “turn off” a 1
»»If we turn on a 0 at bit i and turn off a 1 at bit j, the number changes by 2^i - 2^j.
»»If we want to get a bigger number with the same number of 1s and 0s, i must be bigger than j.


Solution:
1. Traverse from right to left. Once we’ve passed a 1, turn on the next 0. We’ve now increased the number by 2^i. Yikes! Example: xxxxx011100 becomes xxxxx111100
2. Turn off the one that’s just to the right side of that. We’re now bigger by 2^i - 2^(i-1) Example: xxxxx111100 becomes xxxxx101100
3. Make the number as small as possible by rearranging all the 1s to be as far right as possible: Example: xxxxx101100 becomes xxxxx100011


To get the previous number, we do the reverse.
1. Traverse from right to left. Once we’ve passed a zero, turn off the next 1. Example: xxxxx100011 becomes xxxxx000011.
2. Turn on the 0 that is directly to the right. Example: xxxxx000011 becomes xxxxx010011.
3. Make the number as big as possible by shifting all the ones as far to the left as possible. Example: xxxxx010011 becomes xxxxx011100 .


2. Question:

Write a program to swap odd and even bits in an integer with as few instructions as possible (e.g., bit 0 and bit 1 are swapped, bit 2 and bit 3 are swapped, etc).

>> cat swap.c #include <stdio.h>unsigned int swap(unsigned int i){        return (((i & 0xaaaaaaaa) >> 1) | ((i & 0x55555555) << 1));}int main(){        unsigned int i = 10;        printf("%d\n", swap(i));}

3. From CLRS

Problems 4-2: Finding the missing integer
An array A[1  n] contains all the integers from 0 to n except one. It would be easy to determine the missing integer in O(n) time by using an auxiliary array B[0  n] to record which numbers appear in A. In this problem, however, we cannot access an entire integer in A with a single operation. The elements of A are represented in binary, and the only operation we can use to access them is "fetch the jth bit of A[i]," which takes constant time.  Show that if we use only this operation, we can still determine the missing integer in O(n) time.

Answer:

http://www.cs.nyu.edu/courses/summer08/G22.1170-001/hw02-soln.pdf

http://stackoverflow.com/questions/5374539/report-all-missing-numbers-in-an-array-of-integers-represented-in-binary

http://geeksforgeeks.org/forum/topic/amazon-interview-question-for-software-engineerdeveloper-about-algorithms-bit-magic

Say all numbers are represented by k bits and set j as the least significant bit (initially the rightmost).
1. Starting from j, separate all the numbers in L into two sets (S1 containing all numbers that have 1 as its jth bit, and S2 containing all numbers that have 0 in that position).
2. The smaller of the two sets contains the missing number, recurse on this subset and set j = j-1