2014-12-06 80 views
3

我的采访学习,我一直在试图理解现在这个问题了几个小时:位操作修改位,包括数

现在给你两个32位的数字,N和M,以及两个比特位置,我 和j。写一种方法来设置N和M之间的所有位,其中N等于M (例如,M变成位于i并且从j开始的N的子串)。

有人能给出一个完整的例子,并通过实际需要?我是否需要在i和j之间设置M的值,或者实际上M中的位?

是否有一些关于位操作的良好教程来解释这些概念?

谢谢!

+2

这是一个令人惊讶的严重问题措辞。 – 2014-12-06 13:01:17

+0

对不起,我仍然是一个初学者与Stackoverflow! – SummerCode 2014-12-06 13:03:49

+2

我不是说你的问题 - 我的意思是你给的问题。你的比他们的要好得多! – 2014-12-06 13:05:57

回答

2

可使用“masking

  • 使用按位或递增
  • 空出的N比特使用位与和逐位产生用于位置i到j的每一个比特设置为1的掩模来实现不在屏蔽的
  • 使用带有位掩码和
  • 副本位用位或
从M个选择位210

我知道我在我的例子中使用了十六进制,但同样的原则适用,只是更容易阅读。

int n = 0x12345678; 
int m = 0x55555555; 

int i = 4; // assume right to left 
int j = 15; 

int mask = 0; 
for (int pos = i; pos <= j; pos++) { 
    mask = mask | (1 << pos); 
} 
System.out.println(String.format("mask is  0x%08x", mask)); 

int nCleared = n & ~mask; 
System.out.println(String.format("clear n  0x%08x", nCleared)); 

int bitsFromM = (m & mask); 
System.out.println(String.format("Bits from m 0x%08x", bitsFromM)); 

int nWithM = bitsFromM | nCleared; 
System.out.println(String.format("n with m 0x%08x", nWithM)); 

输出

mask is  0x0000fff0 
clear n  0x12340008 
Bits from m 0x00005550 
n with m 0x12345558 
2

比方说,那些2个32位数字是: -

M = "00010101010101010101010101010101"; 
N = "10101010100001010101100101011111"; 
i = 13; 
j = 23; 

他们只是希望你从N的第13位到第23位同那些在M.

我从计数的位置右侧。

           23rd bit 13th bit 

所以,在这里,男的第13到第23位字符= “000101010_____ 10101010101 ___010101010101”;

is the mid-spaced 10101010101. 

因此,N必须是101010101___ 10101010101 _____100101011111

N = 101010101 "10101010101" 100101011111