位操作问题,算法高手请进

r11222 2011-03-26 10:42:51


举个例子 :


例如一个数组有4个字节

二进制为

00000000 00000000 00000000 00000000


从任意一个位开始 , 到任意一个位结束, 把中间的全部位设置为1 , 求最快方法,优美的~~

例如从 4 位开始 ,21位结束,要求结果为


00001111 11111111 11111111 10000000

高手帮我啊~






...全文
2081 120 打赏 收藏 转发到动态 举报
写回复
用AI写文章
120 条回复
切换为时间正序
请发表友善的回复…
发表回复
苍蝇①号 2011-03-30
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

int f(int start, int end){
int tmp = (1<<end) -1;
tmp &= ~((1<<start) - 1);
return tmp;
}

int main(){
printf("%020x\n",f(0,8));
printf("%020x\n",f(0,16));
printf("%020x\n",f(16,24));
printf("%020x\n",f(0,31));


}
luoaiwen1314 2011-03-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 r11222 的回复:]

引用 4 楼 hnuqinhuan 的回复:
我的做法就是用bitset的容器 先从起始位开始 取反 再从结束位开始取反 调用库函数



这个不行~ 其他位可能已经被人置1,这种方法破后了原有的信息了
[/Quote]
你说的是连续一段内都置1,用set、reset怎么不行了?
skyowner2009 2011-03-29
  • 打赏
  • 举报
回复
好像很简单,
如果想把从start到end设为1,
则把1左移start位,
把1右移end位,
两个进行and运算。
「已注销」 2011-03-29
  • 打赏
  • 举报
回复
预先定义好一堆宏,然后算出使用宏的index,再做|运算
ybt631 2011-03-29
  • 打赏
  • 举报
回复
void resetone(unsigned char array[], size_t arrSize, size_t pos_s, size_t pos_e)
{
size_t 4s = pos_s/32+1;
size_t 4e = pos_e/32;

unsigned int* int_array = ( unsigned int*)array;
for(size_t i=4s; i<4e; ++i)
int_array [i] = -1;
if(pos_s % 32)
_resetone(int_array[4s-1], pos_s%32, 32);

if(pos_e% 32)
_resetone(int_array[4e], 0, pos_e%32);

}

void _resetone(unsigned int& val, size_t b_s, size_t b_e)
{
if(b_s)
{
val |= bit_index[b_s];
}
else
{
val |= bit_index_h[b_e];
}
}
cy841219 2011-03-29
  • 打赏
  • 举报
回复
unsigned short int value = 0;
unsigned short int left = 1;
unsigned short int right = 6;
unsigned short int e = ~value;
unsigned short int mask = (( e) << left)&((e) >> (15-right));

使用这个掩码去 或 操作
qq120848369 2011-03-28
  • 打赏
  • 举报
回复
我怀疑两点,1是你不知道我打印的是16进制,2是你不知道打印出来的每一个16进制数是从右往左看的。
qq120848369 2011-03-28
  • 打赏
  • 举报
回复
1 1
2 0 0 0
2 2
4 0 0 0
3 3
8 0 0 0
4 4
10 0 0 0
5 5
20 0 0 0
1 3
e 0 0 0
1 4
1e 0 0 0
1 8
fe 1 0 0

#include <iostream>
#include <cstring>
using namespace std;

void setBits(unsigned char *buffer,int begin,int end)
{
unsigned char *pBeg=&buffer[begin/8];
unsigned char *pEnd=&buffer[end/8];

memset(pBeg,-1,pEnd-pBeg+1); //全部置1

*pBeg&=(-1)<<(begin%8); /*置反*/
*pEnd^=(-1)<<(end%8+1);
}

int main()
{
unsigned char buffer[4]={0};

int i,j;

while(cin>>i>>j)
{
memset(buffer,0,sizeof(buffer));

setBits(buffer,i,j);

for(int i=0;i<4;++i)
{
cout<<hex<<(int)buffer[i]<<" ";
}

cout<<endl;
}

return 0;
}


来,告诉我哪个错了,错哪里了。

我写代码从来都是设计好算法才写,挑出BUG来给我看看。
qq120848369 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 87 楼 sbwwkmyd 的回复:]

引用 84 楼 qq120848369 的回复:
去这高人的主页里看一下,把独钓寒江雪也得罪了,强词夺理,水平烂,装X,装清高,装素质。

做人要摆好心态,就事论事,以理服人,有错就改。
当然我“得罪”过很多人,但是稍明理的人不会去计较言语上的冲突,关键是把问题给解决了。
至于测试,你没那闲心测试明明错误的代码。
[/Quote]

傻逼一个,我真他妈的遇上这种混蛋,没办法了。
有本事给例子,我错了我承认,给不出来还没完没了,你觉得你有意思?
qq120848369 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 87 楼 sbwwkmyd 的回复:]

引用 84 楼 qq120848369 的回复:
去这高人的主页里看一下,把独钓寒江雪也得罪了,强词夺理,水平烂,装X,装清高,装素质。

做人要摆好心态,就事论事,以理服人,有错就改。
当然我“得罪”过很多人,但是稍明理的人不会去计较言语上的冲突,关键是把问题给解决了。
至于测试,你没那闲心测试明明错误的代码。
[/Quote]

有错误就告诉我错误数据,别他妈的张口错闭口错,错在哪里,给我测试用例。
雪人2015 2011-03-28
  • 打赏
  • 举报
回复
争辩中才能清晰。
我顶楼上!
雪人2015 2011-03-28
  • 打赏
  • 举报
回复
用无符号指针去看待,解除索引。
然后左移n位,右移n+m位。

n表示左边几个零,右边表示右边需要几个零。

已经测试过了。

而且楼上很多人都说了这个方法。
showjim 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 84 楼 qq120848369 的回复:]
去这高人的主页里看一下,把独钓寒江雪也得罪了,强词夺理,水平烂,装X,装清高,装素质。
[/Quote]
做人要摆好心态,就事论事,以理服人,有错就改。
当然我“得罪”过很多人,但是稍明理的人不会去计较言语上的冲突,关键是把问题给解决了。
至于测试,你没那闲心测试明明错误的代码。
Huntrees 2011-03-28
  • 打赏
  • 举报
回复
楼主结贴吧。都开始口水仗了,吾等还是跪安吧
qq120848369 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 74 楼 sbwwkmyd 的回复:]

引用 71 楼 qq120848369 的回复:
什么意思,原数据是1000 0001,楼主不是要给一个范围么,哪个范围有问题,我试试.
10000001就一个字节的八个二进制位,第3位不是范围吗?
1个位的都搞不定,第3位到第4位还不是一样不行?
如果这都看不懂,那就当我白说了。
[/Quote]

高人,你能不能用我的代码,用你的测试用例,给我测出一个错误的数据,然后贴上来让我心服口服。
qq120848369 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 82 楼 sbwwkmyd 的回复:]

引用 80 楼 zhao4zhong1 的回复:
引用 77 楼 sbwwkmyd 的回复:
引用 76 楼 zhao4zhong1 的回复:
追求“通用”是一种误区。
从来就没有什么通用的功能!
请问楼上谁的代码能“通用”到将1000000000TB的所有位置1?

常规情况通用就行了吧,这也能究结起来?

请用具体数字定义“常规情况”,否则解答者可以自己随意定义“常规情况”……
[/Quote]

去这高人的主页里看一下,把独钓寒江雪也得罪了,强词夺理,水平烂,装X,装清高,装素质。
Huntrees 2011-03-28
  • 打赏
  • 举报
回复
看楼上的留言我蛋疼啊!!

可以换个思路嘛
全0换1是不是就是全1换0呢

32位1要求哪几位换成0,相信大家都倍精通,无非就是左移移,右移移。

压力有点大,非喜勿喷,还请指教

哈哈
showjim 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 80 楼 zhao4zhong1 的回复:]
引用 77 楼 sbwwkmyd 的回复:
引用 76 楼 zhao4zhong1 的回复:
追求“通用”是一种误区。
从来就没有什么通用的功能!
请问楼上谁的代码能“通用”到将1000000000TB的所有位置1?

常规情况通用就行了吧,这也能究结起来?

请用具体数字定义“常规情况”,否则解答者可以自己随意定义“常规情况”为:
·16位以内
·32位以内
·1024位以……
[/Quote]
另外,我认为常规情况就是,new操作和memset操作能处理多大数据,就是一个常规。
超出这个范围都不属于常规了,那样主体便是复杂的数据管理问题,而不是如果置位的问题了。
showjim 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 80 楼 zhao4zhong1 的回复:]
引用 77 楼 sbwwkmyd 的回复:
引用 76 楼 zhao4zhong1 的回复:
追求“通用”是一种误区。
从来就没有什么通用的功能!
请问楼上谁的代码能“通用”到将1000000000TB的所有位置1?

常规情况通用就行了吧,这也能究结起来?

请用具体数字定义“常规情况”,否则解答者可以自己随意定义“常规情况”为:
·16位以内
·32位以内
·1024位以……
[/Quote]
代码确定下来,环境确定下来,程序能处理的极限情况也就确定下来了。

我倒是真的想了解一下,对于1000000000TB的数据你如何处理?
赵4老师 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 77 楼 sbwwkmyd 的回复:]
引用 76 楼 zhao4zhong1 的回复:
追求“通用”是一种误区。
从来就没有什么通用的功能!
请问楼上谁的代码能“通用”到将1000000000TB的所有位置1?

常规情况通用就行了吧,这也能究结起来?
[/Quote]
请用具体数字定义“常规情况”,否则解答者可以自己随意定义“常规情况”为:
·16位以内
·32位以内
·1024位以内
·16G位以内
麻烦不要在解答者给出代码之后再挑剔其不能解决提问者所谓的“常规情况”下遇到的问题。
加载更多回复(96)

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧