PDA

View Full Version : تغییر تنها یک بیت از یک عدد



soodi1100
یک شنبه 08 تیر 1393, 12:06 عصر
سلام

ببخشید
من یه عدد 4 رقمی دارم به صورت (1111) حالا میخام وقتی وارد یک زیر برنامه میشم بیت دوم این عدد رو بکنم 2 یعنی به صورت 1211 بشه و جا های دیگه میاخام مثلا بیت سوم رو برابر 6 قرار بدم مثلا بشه 1261 ، این در صورتی باشه که با بیت های دیگه کاری ندارم یعنی هرچی مقدارشون میخاد باشه فقط مثلا 6 رو توی بیت سوم قرار بدم
باید چیکار کنم ؟؟؟

ممنون

مسعود اقدسی فام
یک شنبه 08 تیر 1393, 12:54 عصر
منظورتون از بیت رقم هست دیگه؟ بیت فقط صفر و یک می‌تونه باشه. رقم یا بیت رو هم معمولا از راست به چپ (کم‌ارزش به پرارزش) می‌شمارن و ۲ برای ۱۲۱۱ رقم سوم محسوب می‌شه.

برای بیت از or واسه یک کردن و از and برای صفر کردن استفاده می‌شه.

اما برای چیزی که شما می‌خواین، راهش یه کم فرق داره. مثلا یه راهش اینه که:
اگه رقم دوم (دهگان) رو می‌خواید عوض کنید، صد برابر خارج قسمت تقسیم عدد فعلی بر صد و باقیمانده بر ده همون عدد رو با ده برابر رقم دلخواهتون جمع بزنید:


1261 = 100 * ( 1211 / 100 ) + 1211 % 10 + 10 * 6


اینکه چرا ده و صد انتخاب شده هم بستگی به موقعیت رقمتون داره.

محمد فدوی
یک شنبه 08 تیر 1393, 17:11 عصر
اگر میبینی زیاد قراره بیت هارو دستکاری کنی توی برنامت، پیشنهاد میکنم از BITS استفاده کنی... اول این Struct رو به برنامت اضافه کن:

typedef struct BITS {
unsigned b1 : 1;
unsigned b2 : 1;
unsigned b3 : 1;
unsigned b4 : 1;
unsigned b5 : 1;
unsigned b6 : 1;
unsigned b7 : 1;
unsigned b8 : 1;
} *PBITS;


حالا هر عدد رو می تونیم به صورت یه آرایه از BITS در نظر بگیریم... مثلا اینجوری میتونیم بیت سوم یه عدد Integer رو عوض کنیم:

int number = 16;


std::cout << number; // ===> 16


PBITS pBits = (PBITS)&number;
pBits[0].b1 = 1;


std::cout << number; // ===> 24


اگر میخواستیم بیت دهم رو عوض کنیم اینجوری عمل میکردیم:

pBits[1].b1 = 1;

soodi1100
یک شنبه 08 تیر 1393, 21:52 عصر
سلام

خیلی ممنون از راهنمایی دوستان ، به نظر من راه آقای MohamadF (http://barnamenevis.org/member.php?145812-MohamadF) بهتر هست ولی من درست متوجه نشدم به همین دلیل گفتم کاری که میخام بکنم رو توضیح بدم شاید بهتر باشه و راه های بهتری پیدا بشه
خوب من یه کاری کردم اینکه عدد رو حذف کردم و فقط بیت دارم یعنی یا 0 یا 1 که کلیات کارم به اینصورت هست
من 4 تا کلید دارم که هر کلید که زده بشه مقدار یک متغیر رو از 0 به 1 تغییر میده و اگر دوباره زده بشه مقدار همون متغیر رو از 1 به 0 تغییر میده
حالا من میخام این 4 تا کلید رو وضعیتاشون رو توی یه متغیر جا بدم ، یعنی مثلا 1001 که به معنای اینه که کلید 1 فعال و 2 غیر فعال و 3 ...... خوب حالا اینکا رو چطوری انجام بدم ؟؟؟

سوال دومم اینه که میخام توی یه حلقه (فکر کنم حلقه switch/case مناسب باشه) وضعیت یک بیت از این متغیری که دارم رو بخونم ، یعنی توی switch متغیر 1011 باشه و توی هر case من بتونم هر کدوم از بیت ها رو چک کنم مثلا توی case اول ، بیت اول و توی case دوم ، بیت دوم و ..... حالا اینکار رو چطوری باید انجام بدم ؟؟؟

حالا که فقط 0 و 1 دارم فکر کنم بشه از or و and استفاده کرد ، ولی چطوری ؟؟؟

amirtork
دوشنبه 09 تیر 1393, 01:32 صبح
سلام
دوست عزیز یه پیشنهاد دارم، هر چند شما میتونی به همون شکل قبل کار کنی و این رشته عدد 0 و 1 رو به صورت بیتی در نظر بگیری، یه راه دیگه هم داری، اون هم اینه که این اعداد رو بیا به صورت یک سری شی در نظر بگیر، کارت خیلی راحت تر میشه، مثلا بیا این سری از اعداد رو مثل یک سری چراغ(یا هر مدل مناسب تری که خودت سراغ داری) در نظر بگیر، اینجوری میتونی خیلی راحت تر باهاش برخورد کنی.
برای این کار کافیه بری سراغ شی گرایی تو سی پلاس پلاس:
برای این مسئله ای که گفتی من یه کد نوشتم که تقریبا این کاری هست که تو میخوای انجام بدی:

#include <iostream>
using namespace std;


class Lights
{
private: // the default of varuables in class is private, so we dont need this, but i wrote it for better undrestanding
bool state[4];
public:
Lights();
Lights(bool , bool , bool , bool);
bool state_of(int i) {return state[i];};
void change_state_of(int);
};
Lights :: Lights()
{
for(int i = 0 ; i < 4 ; i ++)
state[i] = false;
}
Lights :: Lights(bool a, bool b, bool c , bool d)
{
state[0] = a;
state[1] = b;
state[2] = c;
state[3] = d;
}
void Lights :: change_state_of(int i)
{
if(state[i])
state[i] = false;
else
state[i] = true;
}
int main()
{
Lights lights;
int choose = 0;
int change_light_state;
do{
cout<<"if you want see state of lights enter 1"<<endl;
cout<<"if you want change state of light enter 2"<<endl;
cout<<"if you want to Exit the program enter 3"<<endl;
cin>>choose;
switch (choose)
{
case 1:
system("CLS");
for(int i = 0 ; i < 4 ; i ++)
cout<<"state of "<<i+1<<" is "<<lights.state_of(i)<<endl;
break;
case 2:
system("CLS");
cout<<"enter the number of the light that you want change:"<<endl;
cin>>change_light_state;
lights.change_state_of(change_light_state-1);
break;
case 3:
return 0;
break;
default:
system("CLS");
cerr<<"Your choose is Not valid!"<<endl;
break;
}
}while(choose != 3);
cin.ignore();
cin.get();
return 0;
}

Ananas
دوشنبه 09 تیر 1393, 01:51 صبح
int SetBit(int bits, int index, bool value)
{
if (value)
return (bits | (1L << index));
else
return (bits & !(1L << index));
};

rahnema1
دوشنبه 09 تیر 1393, 05:07 صبح
کلاس bitset از کتابخانه استاندارد می تونه گزینه خوبی باشه

#include <bitset>
#include <iostream>
using namespace std;
int main()
{
bitset<4> bit1("1101");
bitset<4> bit2("1000");

bitset<4> bit3= bit1 bitand bit2;
bit3= bit1 & bit2;
bitset<4> bit4= bit1 bitor bit2;
bit4= bit1 | bit2;
bitset<4> bit5= bit1 xor bit2;
bit5= bit1 ^ bit2;

bit1 = ~bit2;
bit1&= bit2;
bit1|= bit2;
bit1^= bit2;

bit1[1]!=bit2[1];
bit1[2]=1;
bit1[3]=0;
bit1[0]=true;
bit1[1]=false;
}

soodi1100
دوشنبه 09 تیر 1393, 15:56 عصر
سلام

ممنون از همه دوستان ، فقط آقای Ananas (http://barnamenevis.org/member.php?233990-Ananas) من الان چطوری باید از این تابعتون استفاده کنم ؟؟؟
int SetBit(int bits, int index, bool value)


مثلا برای چک کردن یک بیت از 1010 توی حلقه switch/case چطوری باید از این تابعتون بهره برد یا چطوری باید یک بیت رو از 0 به 1 و از 1 به صفر تغییر داد؟؟؟

و آقای rahnema1 (http://barnamenevis.org/member.php?305905-rahnema1) میشه یکم در مورد این bitset و برنامه ای که لطف کردید و گزاشتید توضیح بدید چون من معنی این مثلا bitand وxor و ^ و bit1[1]!=bit2[1]; وbit1 = ~bit2; رو نمیفهمم ؟؟؟!!!

کلا چطوری باید اینها رو توی حلقه switch/case استفاده کرد ؟؟؟

خودم با ذهنم رسید میشه با شیفت دادن ، ولی نمیدونم چطوری شیفت بدم و ...؟؟؟

rahnema1
دوشنبه 09 تیر 1393, 16:50 عصر
و آقای rahnema1 (http://barnamenevis.org/member.php?305905-rahnema1) میشه یکم در مورد این bitset و برنامه ای که لطف کردید و گزاشتید توضیح بدید چون من معنی این مثلا bitand وxor و ^ و bit1[1]!=bit2[1]; وbit1 = ~bit2; رو نمیفهمم ؟؟؟!!!

کلا چطوری باید اینها رو توی حلقه switch/case استفاده کرد ؟؟؟

خودم با ذهنم رسید میشه با شیفت دادن ، ولی نمیدونم چطوری شیفت بدم و ...؟؟؟

نمیدونم دقیقا چی کار می خواهید بکنید. bitand دو تا را با هم and می کنه & هم دقیقا معادل bitand هست
شابد switch لازم نباشه این طور هم می تونید

if(bit1[0]) cout<<0;
if(bit1[1]) cout<<1;
if(bit1[2]) cout<<2;
if(bit1[3]) cout<<3;

soodi1100
دوشنبه 09 تیر 1393, 18:18 عصر
سلام

بازم تشکر
من کلا تو این برنامم میخام این کارو بکنم که
4 زیر برنامه دارم ، توی هر کدوم از این زیر برنامه ها وضعیت هر کدوم از این 4 بیت باید تایین بشه یعنی یا 0 بشه یا 1 که اینو خودم تایین میکنم که 0 یا 1 بشه ولی نمیدونم چطوری مثلا میتونم توی زیر برنامه 2 فقط بیت 2 رو 0 یا 1 کنم ؟؟؟

خوب حالا از این 4 تا زیر برنامه میایم بیرون و وارد یه زیربرنامه دیگه میشیم که اینجا باید هرکدوم از این بیت هامون چک بشه یعنی مثلا عددی که توی اون 4 تا زیر برنامه درست شده به صورت 1011 باشه حالا ما میخایم بگیم که اگر بیت اول 1 بود مثلا اینکار رو بکن یا وارد زیر برنامه مثلا soodi شو و اگر مثلا بیت اول 0 بود بورو وارد یه زیر برنامه دیگه بشو

خوب این کل کار هست و من بقیه برنامه رو نوشتم فقط توی این تایین وضعیت هربیت و چک کردن وضعیت هر بیت به صورت جدا موندم ؟؟؟

راستی فکر کنم حلقه switch/case مناسب باشه چون میخام توی هر case یه چندتا کار رو انجام بدم ولی نمدونم میشه پیادش کرد یا نه


ممون
منتظرم

مسعود اقدسی فام
دوشنبه 09 تیر 1393, 18:55 عصر
switch / case (ساختار کنترلی، و نه حلقه) برای کار شما مناسب نیست. همونطور که دوستمون گفتن بهتر هست از این کد استفاده کنید:



if(bit1[0])
// کارای مربوط به یک بودن بیت اول رو انجام بده
else
// کارای مربوط به صفر بودن بیت اول رو انجام بده


if(bit1[1])
// کارای مربوط به یک بودن بیت دوم رو انجام بده
else
// کارای مربوط به صفر بودن بیت دوم رو انجام بده


if(bit1[2])
// کارای مربوط به یک بودن بیت سوم رو انجام بده

if(bit1[3])
// کارای مربوط به یک بودن بیت چهارم رو انجام بده





...





شما نمی‌تونید این عملیات رو با استفاده از یه switch/case پیاده‌سازی کنید چون دارید شرط تساوی (و عدم تساوی) چهار تا متغیر مختلف رو بررسی می‌کنید. این ساختار زمانی کاربرد داره که جالتای مختلف یه مقدار یا یه متغیر باید بررسی بشه.

مقداردهی به بیت‌ها و خوندن مقدارشون هم که پیام‌های قبلی با مثال نشون داده شده.

rahnema1
دوشنبه 09 تیر 1393, 19:06 عصر
فکر نمکنم مشکلی باشه حالا اگه حتما لازمه از switch استفاده بشه میتونید از حلقه هم استفاده کنید.
ما ابتدا یک متغیر شامل 4 بیت درست می کنیم و اسمش را میذاریم bit1
تابع flip میاد اگه مقدار 0 بود یک میکنه و اگه یک بود صفر می کنه
چند تا زیر برنامه داریم و در هر زیر برنامه بیتی که با اندکس مشخص شده تغییر می کنه
وقتی می نویسیم( bit1.flip(1 یعنی خانه با اندکس 1 را هر چی باشه تغییر بده یعنی اگه صفر باشه بذار یک و اگه یک باشه بذار صفر
همچنین میشه این جور هم نوشت
bit1[2]=1
یعنی خانه شماره 2 را برابر با 1 قرار بده و
bit1[2]=0
یعنی خانه شماره 2 را برابر صفر بذار
دقت کنید اندکس ها از صفر شروع میشن یعنی وقتی من می گم خانه شماره 2 یعنی اگه از 0 بشماریم میشه سومین : 0 و 1و 2

این هم یک نمونه کد باز اگه سوالی داشتید بپرسید

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

int main()
{
bitset<4> bit1("1101");

//zirbarname0
{
bit1.flip(0);
}

//zirbarname1
{
bit1.flip(1);
}

//zirbarname2
{
bit1.flip(2);
}

//zirbarname3
{
bit1.flip(3);
}

for(int i=0;i<4;i++)
switch (bit1[i])
{
case 0:
cout<<"bit "<<i<<" is "<< 0<<endl;
break;
case 1:
cout<<"bit "<<i<<" is "<< 1<<endl;
break;
}
}

soodi1100
دوشنبه 09 تیر 1393, 21:22 عصر
سلام

ببخشید
این کتابخانه bitset.h رو من 2 مدلش رو گرفتم از توی نت ولی هر کدوم یه کتابخانه اد کردن مثلا vector.h که خود این vector خودش 3 تا کتابخانه اد کرده که پس از کلی دانلود کردن کتابخانه آخرش 13 تا ارور به کتابخانه گرفت
از کجا بگیرم؟؟؟

راستی این Flip خیلی عالیه ، و اینکه میشه توی switch همون 4 بیت رو کلا قرار بدیم و توی هر case بنویسیم مثلا bit1[1] که یعنی منظورمون بیت 2 هست ؟؟؟

rahnema1
دوشنبه 09 تیر 1393, 21:52 عصر
سلام

ببخشید
این کتابخانه bitset.h رو من 2 مدلش رو گرفتم از توی نت ولی هر کدوم یه کتابخانه اد کردن مثلا vector.h که خود این vector خودش 3 تا کتابخانه اد کرده که پس از کلی دانلود کردن کتابخانه آخرش 13 تا ارور به کتابخانه گرفت
از کجا بگیرم؟؟؟

راستی این Flip خیلی عالیه ، و اینکه میشه توی switch همون 4 بیت رو کلا قرار بدیم و توی هر case بنویسیم مثلا bit1[1] که یعنی منظورمون بیت 2 هست ؟؟؟

اینطور که معلومه شما دارید از یک کامپایلر از رده خارج استفاده می کنید من پیشنهاد می کنم از codeblock استفاده کنید یا ویژوال استادیو نسخه جدید که هدر bitset داخل خودش داره نه هدر bitset.h
من نمیدونم شما چه اصراری در استفاده از switch دارید با همون if سرو ته اش را هم بیارید
این هم لینک دانلود کد بلاکس
http://sourceforge.net/projects/codeblocks/files/Binaries/13.12/Windows/codeblocks-13.12mingw-setup.exe

یا این یکی :
http://sourceforge.net/projects/codeblocks/files/Binaries/13.12/Windows/codeblocks-13.12mingw-setup-TDM-GCC-481.exe

soodi1100
دوشنبه 09 تیر 1393, 22:35 عصر
سلام

بهتره یکم بیشتر بهتون توضیح بدم
خوب این کامپایلری که من استفاده میکنم نامش keil هست و برای برنامه نویسی و کار با میکروکنترلر ها استفاده میشه
به همین دلیل شاید کنابخانه هاش برای c++ کامل نباشه
و این پروژه ای هم که بنده دارم میسازم یه تایمر و محاسبه گر هزینه برای گیم نت هایی هست که کنسول بازی PS و Xbox دارن ، که میتونن روی LCD این پروژه تایم مصرف و هزینه رو برای 5 دستگاه مختلف مشاهده کنن
این برنامه هم که شما کمک کردید و نوشتیم برای شروع و استپ کردن تایمر های دستگاه هست و هر کدوم به یه کلید وصل هستند و .....

بازم تشکر
انشالله این کتابخانه پیدا بشه و بتونم برنامه رو بنویسم و نتیجه رو بهتون اعلام کنم

rahnema1
سه شنبه 10 تیر 1393, 10:08 صبح
احتمالا کامپایلر زبان سی هست
علاوه بر روشهایی که دوستان پیشنهاد کردند میتونید از این روش هم استفاده کنید

void flip(int *b,int pos)
{
b[pos]=!b[pos];
}
int main()
{
int bit1[4]={1,0,1,1};
flip(bit1,1);
bit1[2]=1;
bit1[3]=0;
}

soodi1100
شنبه 14 تیر 1393, 17:50 عصر
سلام

با تشکر از همه دوستان ، با کمک شما دستگاه آماده شد
گفتم فیلمش رو بزارم ، خالی از لطف نباشه :چشمک:
http://www.aparat.com/v/jN6rn