الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مساعدة يأخوان في عمليات Bitwise And / Bitwise Or و نظام العد الثنائي

بدأه Wolf_Oman في 22 أبريل 2009 · 5 رد · 601 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لدي إستفسار حول نظام العد الثنائي و كيفية تطبيقة على العمليات البرمجية

قمت بتصميم وظيفة لعملية

bitwise AND

بنسبة للأعداد الموجبة سهلة إستطعت برمجة هذه العمليات على نظام العد الثنائي

فمثلا لو أردنا القيام بعملية

bitwise AND

لرقم 20 و الرقم 50

أولا نحول الرقم 20 لنظام العد الثنائي لتصبح

10100

ثم نحول الرقم 50 لنضام العد الثنائي لتصبح

110010

ثم نقوم بعملية المقارنة بطريقة

bitwise AND

010100

110010

بعد المقارنة

010000

لتكون النتيجة

16

طبعا الوظيفة التي أقوم بتصميمها تقوم بنفس الطريقة السابقة و بدون إستخدام وظائف اللغة المخصصة لمثل هذه العمليات

إستفساري حول الأعداد السالبة أولا كيف نحولها لنظام العد الثنائي ثم كيف يتم مقارنتها بطريقة

bitwise AND

بحثت على الشبكة و كل الطرق تقول الآتي

بأن نتعامل مع الرقم على أنه رقم أو عدد موجب ثم نقوم بتغير الصفر إلى واحد و الواحد إلى صفر ثم

نظيف الرقم المتمم واحد ثم نقارن إلا أن النتائج التي حصلت عليها ليست صحيحة وذلك عند مقرنتها

بنتائج الوظائف المخصصة لهذه العملية بانتظار المساعدة و لكم جزيل الشكر و خالص التحية

في أمان الله

Wolf_Oman

صرح السماء

wolf9228

ناقوس الخطر

#2

مرحبا أخوان وين ردودكم الحلوة

icon1.gif

تم تعديل هذه المشاركة بواسطة Wolf_Oman في 22 أبريل 2009 في 17:19

Wolf_Oman

صرح السماء

wolf9228

ناقوس الخطر

#3

السلام عليكم ورحمة الله وبركاته

قمت بكتابة كلاس يتعامل مع الأعداد الصحيحه كما تخزن فى ذاكرة الحاسب

وايضا يعطيك شكل العدد السالب كيف يخزن

وكيفية اجراء Bitwise AND

جربه أخى والحمد لله اعطانى قيم صحيحه تماما

#include<iostream>
#include <string>
#include <math.h>
using namespace std;
class Bin
{
private:
	string b;
	int Dec;
public:
	Bin();
	Bin(int a);
	void print();
	Bin operator&(Bin& b);
	int convert_to_dec();
};
Bin::Bin()
{
 b="00000000 00000000 00000000 00000000";
 Dec=0;
}
Bin::Bin(int a)
{
	 b="00000000 00000000 00000000 00000000";
	 Dec=a;
	int i=b.size()-1;
	int c=abs(a);
	while (c!=0)
	{
		b=c%2+48;
		c=c/2;
		i--;
		if(b==' ') i--;
	}
	if(a<0)
	{
		for (int j=0;j<b.size();j++)
		{
			if(b[j]=='0') b[j]='1';
			else if(b[j]=='1') b[j]='0';
		}
	}	
}
void Bin::print()
{
	cout<<b<<endl;
}
Bin Bin::operator &(Bin& T)
{
	Bin temp;
	for (int i=temp.b.size()-1;i>=0;i--)
	{
		if(b!=' ' && T.b!=' ')
		temp.b=(int(b-48) & int(T.b-48))+48;
	}
	return temp;
}
int Bin::convert_to_dec()
{
	int d=0;
	int c=0;
   for (int i=b.size()-1;i>=0;i--)
	{
		if(b!=' ')
		{
		d+=int(b-48)*pow(2,c);
		c++;
		}
	}
   Dec=d;
   return d;
}
int main()
{
	Bin b(20),c(-50);
	b.print();
	c.print();
	(b & c).print();
	cout<<(b & c).convert_to_dec()<<endl;
	cout<<(20 & -50)<<endl;
	return 0;
}

وهو أيضا يقوم بالتحويل بين الثنائى والعشرى والعكس

ويعرض لك الأعداد على شكل بايتات كل منها مقسم الى 8 بت

بالنسبه لموضوع اضافة الرقم المتمم 1 فهى فى حالة اجراء الجمع ....

تحياتى

اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم

#4
amin_mu123 كتب:
السلام عليكم ورحمة الله وبركاته

قمت بكتابة كلاس يتعامل مع الأعداد الصحيحه كما تخزن فى ذاكرة الحاسب

وايضا يعطيك شكل العدد السالب كيف يخزن

وكيفية اجراء Bitwise AND

جربه أخى والحمد لله اعطانى قيم صحيحه تماما

#include<iostream>
#include <string>
#include <math.h>
using namespace std;
class Bin
{
private:
	string b;
	int Dec;
public:
	Bin();
	Bin(int a);
	void print();
	Bin operator&(Bin& b);
	int convert_to_dec();
};
Bin::Bin()
{
b="00000000 00000000 00000000 00000000";
Dec=0;
}
Bin::Bin(int a)
{
	 b="00000000 00000000 00000000 00000000";
	 Dec=a;
	int i=b.size()-1;
	int c=abs(a);
	while (c!=0)
	{
		b=c%2+48;
		c=c/2;
		i--;
		if(b==' ') i--;
	}
	if(a<0)
	{
		for (int j=0;j<b.size();j++)
		{
			if(b[j]=='0') b[j]='1';
			else if(b[j]=='1') b[j]='0';
		}
	}	
}
void Bin::print()
{
	cout<<b<<endl;
}
Bin Bin::operator &(Bin& T)
{
	Bin temp;
	for (int i=temp.b.size()-1;i>=0;i--)
	{
		if(b!=' ' && T.b!=' ')
		temp.b=(int(b-48) & int(T.b-48))+48;
	}
	return temp;
}
int Bin::convert_to_dec()
{
	int d=0;
	int c=0;
   for (int i=b.size()-1;i>=0;i--)
	{
		if(b!=' ')
		{
		d+=int(b-48)*pow(2,c);
		c++;
		}
	}
   Dec=d;
   return d;
}
int main()
{
	Bin b(20),c(-50);
	b.print();
	c.print();
	(b & c).print();
	cout<<(b & c).convert_to_dec()<<endl;
	cout<<(20 & -50)<<endl;
	return 0;
}

وهو أيضا يقوم بالتحويل بين الثنائى والعشرى والعكس

ويعرض لك الأعداد على شكل بايتات كل منها مقسم الى 8 بت

بالنسبه لموضوع اضافة الرقم المتمم 1 فهى فى حالة اجراء الجمع ....

تحياتى

مشكور أخوي على المساعدة جزاك الله خير ما قصرت لو أني أقوم بتصميم هذه الوظيفة على لغة أخرى إلا أن

هذا المثال كافي جربته قبل قليل على السي بلس و شكرا مجددا و بارك الله فيك و لك كل الإحترام و التقدير

في أمان الله

تم تعديل هذه المشاركة بواسطة Wolf_Oman في 22 أبريل 2009 في 20:02

Wolf_Oman

صرح السماء

wolf9228

ناقوس الخطر

#5

السلام عليكم

وبعد جهد جهيد و عمل مضني تم التوصل لطريقة السليمة لهذه العملية و هذا كود العمليات يعطي قيم صحيحة بالسالب و الموجب أنقله لكم

للفائدة بنسبة لكود أخوي

amin_mu123

لا يعطي قيمة صحيحة لجميع الأرقام

MFC

في أمان الله

// operationDlg.cpp : implementation file
//

#include "stdafx.h"
#include "operation.h"
#include "operationDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CString Twos(int A);
CString StrIsInt(float C);
CString StrIsFloat(float C);
int _POW(int X , int Y);
int Tens(CString B);
int Bit_AND(int value1, int value2);
int Bit_OR(int value1, int value2);
int Bit_XOR(int value1, int value2);
/////////////////////////////////////////////////////////////////////////////
// COperationDlg dialog

COperationDlg::COperationDlg(CWnd* pParent /*=NULL*/)
 : CDialog(COperationDlg::IDD, pParent)
{
 //{{AFX_DATA_INIT(COperationDlg)
  // NOTE: the ClassWizard will add member initialization here
 //}}AFX_DATA_INIT
 // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void COperationDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(COperationDlg)
  // NOTE: the ClassWizard will add DDX and DDV calls here
 //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(COperationDlg, CDialog)
 //{{AFX_MSG_MAP(COperationDlg)
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COperationDlg message handlers

BOOL COperationDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // Set the icon for this dialog.  The framework does this automatically
 //  when the application's main window is not a dialog
 SetIcon(m_hIcon, TRUE);   // Set big icon
 SetIcon(m_hIcon, FALSE);  // Set small icon

 // TODO: Add extra initialization here

 return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void COperationDlg::OnPaint() 
{
 if (IsIconic())
 {
  CPaintDC dc(this); // device context for painting

  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

  // Center icon in client rectangle
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // Draw the icon
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  CDialog::OnPaint();
 }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR COperationDlg::OnQueryDragIcon()
{
 return (HCURSOR) m_hIcon;
}

void COperationDlg::OnButton1() 
{
CFile file;
file.Open("fff.txt", CFile::modeCreate|CFile::modeWrite);


CString StrResult = "";
CString StrResult2 = "";

for (int I = 1; I <= 500; I++) 
{
StrResult2.Insert(StrResult2.GetLength(),"Bit_AND(+");
StrResult = "";
StrResult.Format(_T("%d"), I);
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," , +");
StrResult = "";
StrResult.Format(_T("%d"), (I + 5));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength(),") ==>");
StrResult = "";
StrResult.Format(_T("%d"), Bit_AND(I, (I + 5)));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," ==> ");
StrResult2.Insert(StrResult2.GetLength(),"( +");
StrResult = "";
StrResult.Format(_T("%d"), I);
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," & +");
StrResult = "";
StrResult.Format(_T("%d"), (I + 5));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," ) ==> ");
StrResult.Format(_T("%d"), I & (I + 5));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength(),(char) 13);
StrResult2.Insert(StrResult2.GetLength(),(char) 10);
}

for (I = 1; I <= 500; I++) 
{
StrResult2.Insert(StrResult2.GetLength(),"Bit_AND(-");
StrResult = "";
StrResult.Format(_T("%d"), I);
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," , -");
StrResult = "";
StrResult.Format(_T("%d"), (I + 5));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength(),") ==>");
StrResult = "";
StrResult.Format(_T("%d"), Bit_AND(-I, -(I + 5)));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," ==> ");
StrResult2.Insert(StrResult2.GetLength(),"( -");
StrResult = "";
StrResult.Format(_T("%d"), I);
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," & -");
StrResult = "";
StrResult.Format(_T("%d"), (I + 5));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," ) ==> ");
StrResult.Format(_T("%d"), -I & -(I + 5));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength(),(char) 13);
StrResult2.Insert(StrResult2.GetLength(),(char) 10);
}

for (I = 1; I <= 500; I++) 
{
StrResult2.Insert(StrResult2.GetLength(),"Bit_AND(-");
StrResult = "";
StrResult.Format(_T("%d"), I);
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," , +");
StrResult = "";
StrResult.Format(_T("%d"), (I + 5));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength(),") ==>");
StrResult = "";
StrResult.Format(_T("%d"), Bit_AND(-I, (I + 5)));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," ==> ");
StrResult2.Insert(StrResult2.GetLength(),"( -");
StrResult = "";
StrResult.Format(_T("%d"), I);
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," & +");
StrResult = "";
StrResult.Format(_T("%d"), (I + 5));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," ) ==> ");
StrResult.Format(_T("%d"), -I & (I + 5));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength(),(char) 13);
StrResult2.Insert(StrResult2.GetLength(),(char) 10);
}


file.Write(StrResult2.GetBuffer(0),StrResult2.GetLength());
}



int Bit_AND(int value1, int value2)
{
CString TXT , ALLTXT;
CString A = Twos(value1); //; convert Form Tens To Twos
CString B = Twos(value2); //; convert Form Tens To Twos
int Slen1 = strlen(A) - strlen(B);
int Slen2 = strlen(B) - strlen(A);

if (strlen(A) > strlen(B)); 
{
for (int I = 1; I<= (Slen1); I++) 
{
if (value2 >= 0)  // + value2 Or value2 = 0
{
B = "0" + B;
} else { //; - value2
B = "1" + B;
}} 
}

if (strlen(B) > strlen(A))
{
for (int I = 1; I <= (Slen2); I++) 
{
if (value1 >= 0) // + value1 Or value1 = 0
{
A = "0" + A;
} else { //; - value2
A = "1" + A;
}}
}

for (int M=A.GetLength();M>=1;M--)
{
CString Str1 = A.Left(M).Right(1);
CString Str2 = B.Left(M).Right(1);
if ((value1 < 0) && (value2 < 0)) //operation ==> (-,-) // العملية على ==> (-,-)
{
// TXT = StrIsInt(C) + TXT;; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit 
// Look Func Twos
// في حالة كان الرقم سالب نحوله لرقم موجب ثم نطرح منه واحد لأن ناتج الطرح بنفس قيمة الرقم سالبا
//Twos أنظر الوظيفة
if (Str1 + Str2 == (CString) "11") TXT = "0";
else if (Str1 + Str2 == (CString) "00") TXT = "1";
else if (Str1 + Str2 == (CString) "10") TXT = "1";
else if (Str1 + Str2 == (CString) "01") TXT = "1";
} else { //operation ==> (-,+) Or (+,-) Or (+,+) //No sign bit Or sign bit = 0
// في هذا الإحتمال إلسي تكون النتائج موجبة وذلك بسبب نتائج العملية و التي تعطي قيمة
// موجبة للمتمم و أيضا الإحتمال الأخر و هوه إجراء العملية على عدين موجبين
if (Str1 + Str2 == (CString) "11") TXT = "1";
else if (Str1 + Str2 == (CString) "00") TXT = "0";
else if (Str1 + Str2 == (CString) "10") TXT = "0";
else if (Str1 + Str2 == (CString) "01") TXT = "0";
}
ALLTXT = TXT + ALLTXT;
}

if ((value1 < 0) && (value2 < 0)) //; sign bit bitwise And (signbit ,signbit) / (1 And 1) = 1
{
// في هذا الإحتمال الوحيد بهذه العملية يكون الناتج سالبا و بما أن المتمم يكون في الخانة الأولى
// اليمنى في نظام العدد اثنائي و لا يمكن إلا أن يكون مساويا للواحدفبذالك يمكننا أظافته لنظام العد
// العشري من بعد تحويل الثنائي للعشري
return  (- (Tens(ALLTXT) + 1)); //; convert From Twos To Tens And Add 1 For sign bit
} else {
return Tens(ALLTXT); //; convert From Twos To Tens //No sign bit Or sign bit = 0 
}

}


int Bit_OR(int value1, int value2)
{
CString TXT , ALLTXT;
CString A = Twos(value1); //; convert Form Tens To Twos
CString B = Twos(value2); //; convert Form Tens To Twos
int Slen1 = strlen(A) - strlen(B);
int Slen2 = strlen(B) - strlen(A);

if (strlen(A) > strlen(B)); 
{
for (int I = 1; I <= (Slen1); I++) 
{
if (value2 >= 0)  // + value2 Or value2 = 0
{
B = "0" + B;
} else { //; - value2
B = "1" + B;
}} 
}

if (strlen(B) > strlen(A))
{
for (int I = 1; I <= (Slen2); I++) 
{
if (value1 >= 0) // + value1 Or value1 = 0
{
A = "0" + A;
} else { //; - value2
A = "1" + A;
}}
}

for (int M=A.GetLength();M>=1;M--)
{
CString Str1 = A.Left(M).Right(1);
CString Str2 = B.Left(M).Right(1);
if ((value1 < 0 && value2 >= 0) || (value2 < 0 && value1 >= 0) || (value1 < 0 && value2 < 0)) 
{
// operation ==> (-,+) Or (+,-) Or (-,-)
// TXT = StrIsInt(C) + TXT  convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit 
// Look Func Twos
if (Str1 + Str2 == (CString) "11") TXT = "0";
else if (Str1 + Str2 == (CString) "00") TXT = "1";
else if (Str1 + Str2 == (CString) "10") TXT = "0";
else if (Str1 + Str2 == (CString) "01") TXT = "0";
} else { //operation ==> (+,+) //No sign bit
if (Str1 + Str2 == (CString) "11") TXT = "1";
else if (Str1 + Str2 == (CString) "00") TXT = "0";
else if (Str1 + Str2 == (CString) "10") TXT = "1";
else if (Str1 + Str2 == (CString) "01") TXT = "1";
}
ALLTXT = TXT + ALLTXT;
}

if ((value1 < 0 && value2 >= 0) || (value2 < 0 && value1 >= 0) || (value1 < 0 && value2 < 0)) 
{
// sign bit bitwise OR (signbit OR Number) (Number OR signbit) 
//(signbit OR signbit) / (1 OR  1) = 1 / (1 OR  0) = 1 (0 OR  1) = 1 
// TXT = StrIsInt(C) + TXT  convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit 
// Look Func Twos
return  (- (Tens(ALLTXT) + 1)); //; convert From Twos To Tens And Add 1 For sign bit
} else {
return Tens(ALLTXT); //; convert From Twos To Tens //No sign bit
}

}


int Bit_XOR(int value1, int value2)
{
CString TXT , ALLTXT;
CString A = Twos(value1); //; convert Form Tens To Twos
CString B = Twos(value2); //; convert Form Tens To Twos
int Slen1 = strlen(A) - strlen(B);
int Slen2 = strlen(B) - strlen(A);

if (strlen(A) > strlen(B)); 
{
for (int I = 1; I <= (Slen1); I++) 
{
if (value2 >= 0)  // + value2 Or value2 = 0
{
B = "0" + B;
} else { //; - value2
B = "1" + B;
}} 
}

if (strlen(B) > strlen(A))
{
for (int I = 1; I <= (Slen2); I++) 
{
if (value1 >= 0) // + value1 Or value1 = 0
{
A = "0" + A;
} else { //; - value2
A = "1" + A;
}}
}

for (int M=A.GetLength();M>=1;M--)
{
CString Str1 = A.Left(M).Right(1);
CString Str2 = B.Left(M).Right(1);
if ((value1 < 0 && value2 > 0) || (value2 < 0 && value1 > 0)) 
{
// operation ==> (-,+) Or (+,-) 
// TXT = StrIsInt(C) + TXT  convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit 
// Look Func Twos
if (Str1 + Str2 == (CString) "11") TXT = "1";
else if (Str1 + Str2 == (CString) "00") TXT = "1";
else if (Str1 + Str2 == (CString) "10") TXT = "0";
else if (Str1 + Str2 == (CString) "01") TXT = "0";
} else { //operation ==> (+,+) (-,-) // No sign bit Or sign bit = 0
if (Str1 + Str2 == (CString) "11") TXT = "0";
else if (Str1 + Str2 == (CString) "00") TXT = "0";
else if (Str1 + Str2 == (CString) "10") TXT = "1";
else if (Str1 + Str2 == (CString) "01") TXT = "1";
}
ALLTXT = TXT + ALLTXT;
}

if ((value1 < 0 && value2 > 0) || (value2 < 0 && value1 > 0)) 
{
//; sign bit bitwise exclusive OR (signbit XOR Number) (Number XOR signbit)  (1 XOR 0) = 1 (0 XOR 1) = 1 
// TXT = StrIsInt(C) + TXT  convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit 
// Look Func Twos
return  (- (Tens(ALLTXT) + 1)); //; convert From Twos To Tens And Add 1 For sign bit
} else {
return Tens(ALLTXT); //; convert From Twos To Tens //No sign bit Or sign bit = 0
}

}




CString Twos(int A) //; convert Form Tens To Twos 
{
float C = A;
CString TXT = "";
if(A < 0) C = (abs(A) - 1); //; -A = (+A - 1) Look bitwise NOT // bitwise NOT أنظر 
// في حالة كان الرقم سالب نحوله لرقم موجب ثم نطرح منه واحد لأن ناتج الطرح بنفس قيمة الرقم سالبا
do
{
C = (C / 2); //; / int($C) // نقوم بالقسمة لتحويل لنظام العد الثنائي
if(A < 0) //; if -A
{
TXT = StrIsInt(C) + TXT; //; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit
// نحول ناتج عملية الطرح عكسيا ليصبح عددا موجبا لندخله في العمليات على أساس أنه موجب
} else { //; Else + A Or 0

TXT = StrIsFloat(C) + TXT; //; convert Form +A To Twos +A
// في حالة كان الرقم موجبا نحوله مباشرة لنظام العد الثائي ليدخل في العمليات و هووه موجب
}
C = int(C);
} while (C >= 1);
return TXT;
}


int Tens(CString B) // convert From Twos To Tens
{
int D =0;
int C =0;
for (int M=B.GetLength();M>=1;M--)
{
D += ( _ttoi(B.Left(M).Right(1)) * _POW(2 , C) ); //; convert From Twos To Tens
C +=1;
}
return D;
}


CString StrIsInt(float C)
{
CString iResult = "";
iResult.Format(_T("%g"), C);
if (iResult.Find(".",1) == -1)
return "1";
else 
return "0";
}

CString StrIsFloat(float C)
{
CString iResult = "";
iResult.Format(_T("%g"), C);
if (iResult.Find(".",1) == -1)
return "0";
else
return "1";
}

int _POW(int X , int Y)
{
int Z = 1;
for (int M = 1; M <= Y; M++) 
{
Z *= X;
}
return Z;
}

وهذا نفس الكود على لغة

Autoit

 

MsgBox(0,"" , _
Bit_AND(7,12))

Func Bit_AND($value1, $value2 , $value = '')
$BOOL =  IsNumber($value) Or StringStripWS($value, 8) = '' 
if IsNumber($value1) And IsNumber($value2) And ($BOOL) Then
Dim $TXT = "" ,$TXT2 = ""

$A = Twos($value1); convert Form Tens To Twos
$B = Twos($value2); convert Form Tens To Twos

If StringLen($A) > StringLen($B) Then
For $I = 1 To StringLen($A) - StringLen($B) Step 1
Select
Case $value2 >= 0; + value2 Or value2 = 0
$B = "0" & $B
Case $value2 < 0; - value2
$B = "1" & $B
EndSelect
Next
ElseIf StringLen($B) > StringLen($A) Then
For $I = 1 To StringLen($B) - StringLen($A) Step 1
Select
Case $value1 >= 0; + value1 Or value1 = 0
$A =  "0" & $A
Case $value1 < 0; - value2
$A = "1" & $A
EndSelect
Next
EndIf

$A = StringSplit($A,"")
$B = StringSplit($B,"")

for $I = $A[0] To 1 Step -1
Select 
Case $value1 < 0 And $value2 < 0
;Case operation ==> (-,-)
; $TXT = IsInt($C) & $TXT; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit Look Func Twos
Select
Case $A[$i] & $B[$i] = '11'
$TXT = '0'
Case $A[$i] & $B[$i] = '00'
$TXT = '1'
Case $A[$i] & $B[$i] = '10'
$TXT = '1'
Case $A[$i] & $B[$i] = '01'
$TXT = '1'
EndSelect
Case Else 
;Case operation ==> (-,+) Or (+,-) Or (+,+) No sign bit Or sign bit = 0
Select
Case $A[$i] & $B[$i] = '11'
$TXT = '1'
Case $A[$i] & $B[$i] = '00'
$TXT = '0'
Case $A[$i] & $B[$i] = '10'
$TXT = '0'
Case $A[$i] & $B[$i] = '01'
$TXT = '0'
EndSelect
EndSelect
$TXT2 = $TXT & $TXT2
Next
$E = StringSplit($TXT2,"")
Select
Case StringStripWS($value, 8) = ''
If ($value1 < 0 And $value2 < 0) Then; sign bit bitwise And (signbit ,signbit) / (1 And 1) = 1
Return (- (Tens($E) + 1)) ; convert From Twos To Tens And Add 1 For sign bit
Else
Return Tens($E); convert From Twos To Tens 
EndIf
Case StringStripWS($value, 8) <> ''
If ($value1 < 0 And $value2 < 0) Then; sign bit bitwise And (signbit ,signbit) / (1 And 1) = 1
$A = (- (Tens($E) + 1));; convert From Twos To Tens And Add 1 For sign bit
Else
$A = (Tens($E)); convert From Twos To Tens  // No sign bit Or sign bit = 0
EndIf
Bit_AND($A, $value,"")
EndSelect
Else
Return ""
EndIf
EndFunc


Func Bit_OR($value1, $value2 , $value = '')
$BOOL =  IsNumber($value) Or StringStripWS($value, 8) = '' 
if IsNumber($value1) And IsNumber($value2) And ($BOOL) Then
Dim $TXT = "" ,$TXT2 = ""

$A = Twos($value1); convert Form Tens To Twos
$B = Twos($value2); convert Form Tens To Twos

If StringLen($A) > StringLen($B) Then
For $I = 1 To StringLen($A) - StringLen($B) Step 1
Select
Case $value2 >= 0; + value2 Or value2 = 0
$B = "0" & $B
Case $value2 < 0; - value2
$B = "1" & $B
EndSelect
Next
ElseIf StringLen($B) > StringLen($A) Then
For $I = 1 To StringLen($B) - StringLen($A) Step 1
Select
Case $value1 >= 0; + value1 Or value1 = 0
$A =  "0" & $A
Case $value1 < 0; - value2
$A = "1" & $A
EndSelect
Next
EndIf
$A = StringSplit($A,"")
$B = StringSplit($B,"")
for $I = $A[0] To 1 Step -1
Select 
Case ($value1 < 0 And $value2 >= 0) Or ($value2 < 0 And $value1 >= 0) Or ($value1 < 0 And $value2 < 0) 
;Case operation ==> (-,+) Or (+,-) Or (-,-)
; $TXT = IsInt($C) & $TXT; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit Look Func Twos
Select
Case $A[$i] & $B[$i] = '11'
$TXT = '0'
Case $A[$i] & $B[$i] = '00'
$TXT = '1'
Case $A[$i] & $B[$i] = '10'
$TXT = '0'
Case $A[$i] & $B[$i] = '01'
$TXT = '0'
EndSelect
Case Else;operation ==> (+,+) No sign bit 
Select
Case $A[$i] & $B[$i] = '11'
$TXT = '1'
Case $A[$i] & $B[$i] = '00'
$TXT = '0'
Case $A[$i] & $B[$i] = '10'
$TXT = '1'
Case $A[$i] & $B[$i] = '01'
$TXT = '1'
EndSelect
EndSelect
$TXT2 = $TXT & $TXT2
Next
$E = StringSplit($TXT2,"")
Select
Case StringStripWS($value, 8) = ''
If ($value1 < 0 And $value2 >= 0) Or ($value2 < 0 And $value1 >= 0) Or ($value1 < 0 And $value2 < 0) Then 
; sign bit bitwise OR (signbit OR Number) (Number OR signbit) (signbit OR signbit) / (1 OR  1) = 1 / (1 OR  0) = 1 (0 OR  1) = 1 
; $TXT = IsInt($C) & $TXT; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit Look Func Twos
Return (- (Tens($E) + 1)); convert From Twos To Tens And Add 1 For sign bit
Else
Return Tens($E); convert From Twos To Tens // No sign bit Or sign bit = 0
EndIf
Case StringStripWS($value, 8) <> ''
if ($value1 < 0 And $value2 >= 0) Or ($value2 < 0 And $value1 >= 0) Or ($value1 < 0 And $value2 < 0) Then 
; sign bit bitwise OR (signbit OR Number) (Number OR signbit) (signbit ,signbit) / (1 OR  1) = 1 / (1 OR  0) = 1 (0 OR  1) = 1 / (0 OR  0) = 1
; $TXT = IsInt($C) & $TXT; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit Look Func Twos
$A = (- (Tens($E) + 1)); convert From Twos To Tens And Add 1 For sign bit
Else
$A = (Tens($E)); convert From Twos To Tens //No sign bit 
EndIf
Bit_OR($A, $value,"")
EndSelect
Else
Return ""
EndIf
EndFunc




Func Bit_XOR($value1, $value2 , $value = '')
$BOOL =  IsNumber($value) Or StringStripWS($value, 8) = '' 
if IsNumber($value1) And IsNumber($value2) And ($BOOL) Then
Dim $TXT = "" ,$TXT2 = ""

$A = Twos($value1); convert Form Tens To Twos
$B = Twos($value2); convert Form Tens To Twos

If StringLen($A) > StringLen($B) Then
For $I = 1 To StringLen($A) - StringLen($B) Step 1
Select
Case $value2 >= 0; + value2 Or value2 = 0
$B = "0" & $B
Case $value2 < 0; - value2
$B = "1" & $B
EndSelect
Next
ElseIf StringLen($B) > StringLen($A) Then
For $I = 1 To StringLen($B) - StringLen($A) Step 1
Select
Case $value1 >= 0; + value1 Or value1 = 0
$A =  "0" & $A
Case $value1 < 0; - value2
$A = "1" & $A
EndSelect
Next
EndIf

$A = StringSplit($A,"")
$B = StringSplit($B,"")

for $I = $A[0] To 1 Step -1
Select 
Case ($value1 < 0 And $value2 > 0) Or ($value2 < 0 And $value1 > 0)
;Case operation ==> (-,+) Or (+,-) 
; $TXT = IsInt($C) & $TXT; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit Look Func Twos
Select
Case $A[$i] & $B[$i] = '11'
$TXT = '1'
Case $A[$i] & $B[$i] = '00'
$TXT = '1'
Case $A[$i] & $B[$i] = '10'
$TXT = '0'
Case $A[$i] & $B[$i] = '01'
$TXT = '0'
EndSelect
Case Else;operation ==> (+,+) (-,-) // No sign bit Or sign bit = 0
Select
Case $A[$i] & $B[$i] = '11'
$TXT = '0'
Case $A[$i] & $B[$i] = '00'
$TXT = '0'
Case $A[$i] & $B[$i] = '10'
$TXT = '1'
Case $A[$i] & $B[$i] = '01'
$TXT = '1'
EndSelect
EndSelect
$TXT2 = $TXT & $TXT2
Next
$E = StringSplit($TXT2,"")
Select
Case StringStripWS($value, 8) = ''
If ($value1 < 0 And $value2 > 0) Or ($value2 < 0 And $value1 > 0) Then 
; sign bit bitwise exclusive OR (signbit XOR Number) (Number XOR signbit)  (1 XOR 0) = 1 (0 XOR 1) = 1 
; $TXT = IsInt($C) & $TXT; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit Look Func Twos
Return (- (Tens($E) + 1)); convert From Twos To Tens And Add 1 For sign bit
Else
Return Tens($E)
EndIf
Case StringStripWS($value, 8) <> ''
If  ($value1 < 0 And $value2 > 0) Or ($value2 < 0 And $value1 > 0) Then 
; sign bit bitwise exclusive OR (signbit XOR Number) (Number XOR signbit)  (1 XOR 0) = 1 (0 XOR 1) = 1 
; $TXT = IsInt($C) & $TXT; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit Look Func Twos
$A = (- (Tens($E) + 1)); convert From Twos To Tens And Add 1 For sign bit
Else
$A = (Tens($E)); convert From Twos To Tens //No sign bit Or sign bit = 0
EndIf
Bit_XOR($A, $value,"")
EndSelect
Else
Return ""
EndIf
EndFunc


Func Twos($A); convert Form Tens To Twos 
$C = $A
if($A < 0) Then $C = (abs($A) - 1); -A = (+A - 1) Look bitwise NOT
$TXT = ""
Do
$C = (int($C) / 2); / int($C)
if($A < 0) Then; if -A
$TXT = IsInt($C) & $TXT; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit
ElseIf ($A >= 0) Then; ElseIf + A Or 0
$TXT = IsFloat($C) & $TXT; convert Form +A To Twos +A
EndIf
Until(Int($C) < 1)
MsgBox(0,"",$TXT)
Return $TXT
EndFunc


Func Tens($B); convert From Twos To Tens
$D =0
$C =0
for $I = $B[0] To 1 Step -1
$D += ($B[$I] * POW(2 , $C)); convert From Twos To Tens
$C +=1 
Next
Return $D
EndFunc

Func POW($X , $Y)
$Z = 1
For $I = 1 To $Y  Step 1
$Z *= $X
Next
Return $Z
EndFunc

تم تعديل هذه المشاركة بواسطة Wolf_Oman في 28 أبريل 2009 في 00:53

Wolf_Oman

صرح السماء

wolf9228

ناقوس الخطر

#6

السلام عليكم

وبعد جهد جهيد و عمل مضني تم التوصل لطريقة السليمة لهذه العملية و هذا كود العمليات يعطي قيم صحيحة بالسالب و الموجب أنقله لكم

للإستفادة

// operationDlg.cpp : implementation file
//

#include "stdafx.h"
#include "operation.h"
#include "operationDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CString Twos(int A);
CString StrIsInt(float C);
CString StrIsFloat(float C);
int _POW(int X , int Y);
int Tens(CString B);
int Bit_AND(int value1, int value2);
int Bit_OR(int value1, int value2);
int Bit_XOR(int value1, int value2);
/////////////////////////////////////////////////////////////////////////////
// COperationDlg dialog

COperationDlg::COperationDlg(CWnd* pParent /*=NULL*/)
 : CDialog(COperationDlg::IDD, pParent)
{
 //{{AFX_DATA_INIT(COperationDlg)
  // NOTE: the ClassWizard will add member initialization here
 //}}AFX_DATA_INIT
 // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void COperationDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(COperationDlg)
  // NOTE: the ClassWizard will add DDX and DDV calls here
 //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(COperationDlg, CDialog)
 //{{AFX_MSG_MAP(COperationDlg)
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COperationDlg message handlers

BOOL COperationDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // Set the icon for this dialog.  The framework does this automatically
 //  when the application's main window is not a dialog
 SetIcon(m_hIcon, TRUE);   // Set big icon
 SetIcon(m_hIcon, FALSE);  // Set small icon

 // TODO: Add extra initialization here

 return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void COperationDlg::OnPaint() 
{
 if (IsIconic())
 {
  CPaintDC dc(this); // device context for painting

  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

  // Center icon in client rectangle
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // Draw the icon
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  CDialog::OnPaint();
 }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR COperationDlg::OnQueryDragIcon()
{
 return (HCURSOR) m_hIcon;
}

void COperationDlg::OnButton1() 
{
CFile file;
file.Open("fff.txt", CFile::modeCreate|CFile::modeWrite);


CString StrResult = "";
CString StrResult2 = "";

for (int I = 1; I <= 500; I++) 
{
StrResult2.Insert(StrResult2.GetLength(),"Bit_AND(+");
StrResult = "";
StrResult.Format(_T("%d"), I);
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," , +");
StrResult = "";
StrResult.Format(_T("%d"), (I + 5));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength(),") ==>");
StrResult = "";
StrResult.Format(_T("%d"), Bit_AND(I, (I + 5)));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," ==> ");
StrResult2.Insert(StrResult2.GetLength(),"( +");
StrResult = "";
StrResult.Format(_T("%d"), I);
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," & +");
StrResult = "";
StrResult.Format(_T("%d"), (I + 5));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," ) ==> ");
StrResult.Format(_T("%d"), I & (I + 5));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength(),(char) 13);
StrResult2.Insert(StrResult2.GetLength(),(char) 10);
}

for (I = 1; I <= 500; I++) 
{
StrResult2.Insert(StrResult2.GetLength(),"Bit_AND(-");
StrResult = "";
StrResult.Format(_T("%d"), I);
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," , -");
StrResult = "";
StrResult.Format(_T("%d"), (I + 5));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength(),") ==>");
StrResult = "";
StrResult.Format(_T("%d"), Bit_AND(-I, -(I + 5)));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," ==> ");
StrResult2.Insert(StrResult2.GetLength(),"( -");
StrResult = "";
StrResult.Format(_T("%d"), I);
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," & -");
StrResult = "";
StrResult.Format(_T("%d"), (I + 5));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," ) ==> ");
StrResult.Format(_T("%d"), -I & -(I + 5));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength(),(char) 13);
StrResult2.Insert(StrResult2.GetLength(),(char) 10);
}

for (I = 1; I <= 500; I++) 
{
StrResult2.Insert(StrResult2.GetLength(),"Bit_AND(-");
StrResult = "";
StrResult.Format(_T("%d"), I);
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," , +");
StrResult = "";
StrResult.Format(_T("%d"), (I + 5));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength(),") ==>");
StrResult = "";
StrResult.Format(_T("%d"), Bit_AND(-I, (I + 5)));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," ==> ");
StrResult2.Insert(StrResult2.GetLength(),"( -");
StrResult = "";
StrResult.Format(_T("%d"), I);
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," & +");
StrResult = "";
StrResult.Format(_T("%d"), (I + 5));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength()," ) ==> ");
StrResult.Format(_T("%d"), -I & (I + 5));
StrResult2.Insert(StrResult2.GetLength(),StrResult.GetBuffer(0));
StrResult2.Insert(StrResult2.GetLength(),(char) 13);
StrResult2.Insert(StrResult2.GetLength(),(char) 10);
}


file.Write(StrResult2.GetBuffer(0),StrResult2.GetLength());
}



int Bit_AND(int value1, int value2)
{
CString TXT , ALLTXT;
CString A = Twos(value1); //; convert Form Tens To Twos
CString B = Twos(value2); //; convert Form Tens To Twos
int Slen1 = strlen(A) - strlen(B);
int Slen2 = strlen(B) - strlen(A);

if (strlen(A) > strlen(B)); 
{
for (int I = 1; I<= (Slen1); I++) 
{
if (value2 >= 0)  // + value2 Or value2 = 0
{
B = "0" + B;
} else { //; - value2
B = "1" + B;
}} 
}

if (strlen(B) > strlen(A))
{
for (int I = 1; I <= (Slen2); I++) 
{
if (value1 >= 0) // + value1 Or value1 = 0
{
A = "0" + A;
} else { //; - value2
A = "1" + A;
}}
}

for (int M=A.GetLength();M>=1;M--)
{
CString Str1 = A.Left(M).Right(1);
CString Str2 = B.Left(M).Right(1);
if ((value1 < 0) && (value2 < 0)) //operation ==> (-,-) // العملية على ==> (-,-)
{
// TXT = StrIsInt(C) + TXT;; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit 
// Look Func Twos
// في حالة كان الرقم سالب نحوله لرقم موجب ثم نطرح منه واحد لأن ناتج الطرح بنفس قيمة الرقم سالبا
//Twos أنظر الوظيفة
if (Str1 + Str2 == (CString) "11") TXT = "0";
else if (Str1 + Str2 == (CString) "00") TXT = "1";
else if (Str1 + Str2 == (CString) "10") TXT = "1";
else if (Str1 + Str2 == (CString) "01") TXT = "1";
} else { //operation ==> (-,+) Or (+,-) Or (+,+) //No sign bit Or sign bit = 0
// في هذا الإحتمال إلسي تكون النتائج موجبة وذلك بسبب نتائج العملية و التي تعطي قيمة
// موجبة للمتمم و أيضا الإحتمال الأخر و هوه إجراء العملية على عدين موجبين
if (Str1 + Str2 == (CString) "11") TXT = "1";
else if (Str1 + Str2 == (CString) "00") TXT = "0";
else if (Str1 + Str2 == (CString) "10") TXT = "0";
else if (Str1 + Str2 == (CString) "01") TXT = "0";
}
ALLTXT = TXT + ALLTXT;
}

if ((value1 < 0) && (value2 < 0)) //; sign bit bitwise And (signbit ,signbit) / (1 And 1) = 1
{
// في هذا الإحتمال الوحيد بهذه العملية يكون الناتج سالبا و بما أن المتمم يكون في الخانة الأولى
// اليمنى في نظام العدد اثنائي و لا يمكن إلا أن يكون مساويا للواحدفبذالك يمكننا أظافته لنظام العد
// العشري من بعد تحويل الثنائي للعشري
return  (- (Tens(ALLTXT) + 1)); //; convert From Twos To Tens And Add 1 For sign bit
} else {
return Tens(ALLTXT); //; convert From Twos To Tens //No sign bit Or sign bit = 0 
}

}


int Bit_OR(int value1, int value2)
{
CString TXT , ALLTXT;
CString A = Twos(value1); //; convert Form Tens To Twos
CString B = Twos(value2); //; convert Form Tens To Twos
int Slen1 = strlen(A) - strlen(B);
int Slen2 = strlen(B) - strlen(A);

if (strlen(A) > strlen(B)); 
{
for (int I = 1; I <= (Slen1); I++) 
{
if (value2 >= 0)  // + value2 Or value2 = 0
{
B = "0" + B;
} else { //; - value2
B = "1" + B;
}} 
}

if (strlen(B) > strlen(A))
{
for (int I = 1; I <= (Slen2); I++) 
{
if (value1 >= 0) // + value1 Or value1 = 0
{
A = "0" + A;
} else { //; - value2
A = "1" + A;
}}
}

for (int M=A.GetLength();M>=1;M--)
{
CString Str1 = A.Left(M).Right(1);
CString Str2 = B.Left(M).Right(1);
if ((value1 < 0 && value2 >= 0) || (value2 < 0 && value1 >= 0) || (value1 < 0 && value2 < 0)) 
{
// operation ==> (-,+) Or (+,-) Or (-,-)
// TXT = StrIsInt(C) + TXT  convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit 
// Look Func Twos
if (Str1 + Str2 == (CString) "11") TXT = "0";
else if (Str1 + Str2 == (CString) "00") TXT = "1";
else if (Str1 + Str2 == (CString) "10") TXT = "0";
else if (Str1 + Str2 == (CString) "01") TXT = "0";
} else { //operation ==> (+,+) //No sign bit
if (Str1 + Str2 == (CString) "11") TXT = "1";
else if (Str1 + Str2 == (CString) "00") TXT = "0";
else if (Str1 + Str2 == (CString) "10") TXT = "1";
else if (Str1 + Str2 == (CString) "01") TXT = "1";
}
ALLTXT = TXT + ALLTXT;
}

if ((value1 < 0 && value2 >= 0) || (value2 < 0 && value1 >= 0) || (value1 < 0 && value2 < 0)) 
{
// sign bit bitwise OR (signbit OR Number) (Number OR signbit) 
//(signbit OR signbit) / (1 OR  1) = 1 / (1 OR  0) = 1 (0 OR  1) = 1 
// TXT = StrIsInt(C) + TXT  convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit 
// Look Func Twos
return  (- (Tens(ALLTXT) + 1)); //; convert From Twos To Tens And Add 1 For sign bit
} else {
return Tens(ALLTXT); //; convert From Twos To Tens //No sign bit
}

}


int Bit_XOR(int value1, int value2)
{
CString TXT , ALLTXT;
CString A = Twos(value1); //; convert Form Tens To Twos
CString B = Twos(value2); //; convert Form Tens To Twos
int Slen1 = strlen(A) - strlen(B);
int Slen2 = strlen(B) - strlen(A);

if (strlen(A) > strlen(B)); 
{
for (int I = 1; I <= (Slen1); I++) 
{
if (value2 >= 0)  // + value2 Or value2 = 0
{
B = "0" + B;
} else { //; - value2
B = "1" + B;
}} 
}

if (strlen(B) > strlen(A))
{
for (int I = 1; I <= (Slen2); I++) 
{
if (value1 >= 0) // + value1 Or value1 = 0
{
A = "0" + A;
} else { //; - value2
A = "1" + A;
}}
}

for (int M=A.GetLength();M>=1;M--)
{
CString Str1 = A.Left(M).Right(1);
CString Str2 = B.Left(M).Right(1);
if ((value1 < 0 && value2 > 0) || (value2 < 0 && value1 > 0)) 
{
// operation ==> (-,+) Or (+,-) 
// TXT = StrIsInt(C) + TXT  convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit 
// Look Func Twos
if (Str1 + Str2 == (CString) "11") TXT = "1";
else if (Str1 + Str2 == (CString) "00") TXT = "1";
else if (Str1 + Str2 == (CString) "10") TXT = "0";
else if (Str1 + Str2 == (CString) "01") TXT = "0";
} else { //operation ==> (+,+) (-,-) // No sign bit Or sign bit = 0
if (Str1 + Str2 == (CString) "11") TXT = "0";
else if (Str1 + Str2 == (CString) "00") TXT = "0";
else if (Str1 + Str2 == (CString) "10") TXT = "1";
else if (Str1 + Str2 == (CString) "01") TXT = "1";
}
ALLTXT = TXT + ALLTXT;
}

if ((value1 < 0 && value2 > 0) || (value2 < 0 && value1 > 0)) 
{
//; sign bit bitwise exclusive OR (signbit XOR Number) (Number XOR signbit)  (1 XOR 0) = 1 (0 XOR 1) = 1 
// TXT = StrIsInt(C) + TXT  convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit 
// Look Func Twos
return  (- (Tens(ALLTXT) + 1)); //; convert From Twos To Tens And Add 1 For sign bit
} else {
return Tens(ALLTXT); //; convert From Twos To Tens //No sign bit Or sign bit = 0
}

}




CString Twos(int A) //; convert Form Tens To Twos 
{
float C = A;
CString TXT = "";
if(A < 0) C = (abs(A) - 1); //; -A = (+A - 1) Look bitwise NOT // bitwise NOT أنظر 
// في حالة كان الرقم سالب نحوله لرقم موجب ثم نطرح منه واحد لأن ناتج الطرح بنفس قيمة الرقم سالبا
do
{
C = (C / 2); //; / int($C) // نقوم بالقسمة لتحويل لنظام العد الثنائي
if(A < 0) //; if -A
{
TXT = StrIsInt(C) + TXT; //; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit
// نحول ناتج عملية الطرح عكسيا ليصبح عددا موجبا لندخله في العمليات على أساس أنه موجب
} else { //; Else + A Or 0

TXT = StrIsFloat(C) + TXT; //; convert Form +A To Twos +A
// في حالة كان الرقم موجبا نحوله مباشرة لنظام العد الثائي ليدخل في العمليات و هووه موجب
}
C = int(C);
} while (C >= 1);
return TXT;
}


int Tens(CString B) // convert From Twos To Tens
{
int D =0;
int C =0;
for (int M=B.GetLength();M>=1;M--)
{
D += ( _ttoi(B.Left(M).Right(1)) * _POW(2 , C) ); //; convert From Twos To Tens
C +=1;
}
return D;
}


CString StrIsInt(float C)
{
CString iResult = "";
iResult.Format(_T("%g"), C);
if (iResult.Find(".",1) == -1)
return "1";
else 
return "0";
}

CString StrIsFloat(float C)
{
CString iResult = "";
iResult.Format(_T("%g"), C);
if (iResult.Find(".",1) == -1)
return "0";
else
return "1";
}

int _POW(int X , int Y)
{
int Z = 1;
for (int M = 1; M <= Y; M++) 
{
Z *= X;
}
return Z;
}

Autoit

 

MsgBox(0,"" , _
Bit_AND(7,12))

Func Bit_AND($value1, $value2 , $value = '')
$BOOL =  IsNumber($value) Or StringStripWS($value, 8) = '' 
if IsNumber($value1) And IsNumber($value2) And ($BOOL) Then
Dim $TXT = "" ,$TXT2 = ""

$A = Twos($value1); convert Form Tens To Twos
$B = Twos($value2); convert Form Tens To Twos

If StringLen($A) > StringLen($B) Then
For $I = 1 To StringLen($A) - StringLen($B) Step 1
Select
Case $value2 >= 0; + value2 Or value2 = 0
$B = "0" & $B
Case $value2 < 0; - value2
$B = "1" & $B
EndSelect
Next
ElseIf StringLen($B) > StringLen($A) Then
For $I = 1 To StringLen($B) - StringLen($A) Step 1
Select
Case $value1 >= 0; + value1 Or value1 = 0
$A =  "0" & $A
Case $value1 < 0; - value2
$A = "1" & $A
EndSelect
Next
EndIf

$A = StringSplit($A,"")
$B = StringSplit($B,"")

for $I = $A[0] To 1 Step -1
Select 
Case $value1 < 0 And $value2 < 0
;Case operation ==> (-,-)
; $TXT = IsInt($C) & $TXT; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit Look Func Twos
Select
Case $A[$i] & $B[$i] = '11'
$TXT = '0'
Case $A[$i] & $B[$i] = '00'
$TXT = '1'
Case $A[$i] & $B[$i] = '10'
$TXT = '1'
Case $A[$i] & $B[$i] = '01'
$TXT = '1'
EndSelect
Case Else 
;Case operation ==> (-,+) Or (+,-) Or (+,+) No sign bit Or sign bit = 0
Select
Case $A[$i] & $B[$i] = '11'
$TXT = '1'
Case $A[$i] & $B[$i] = '00'
$TXT = '0'
Case $A[$i] & $B[$i] = '10'
$TXT = '0'
Case $A[$i] & $B[$i] = '01'
$TXT = '0'
EndSelect
EndSelect
$TXT2 = $TXT & $TXT2
Next
$E = StringSplit($TXT2,"")
Select
Case StringStripWS($value, 8) = ''
If ($value1 < 0 And $value2 < 0) Then; sign bit bitwise And (signbit ,signbit) / (1 And 1) = 1
Return (- (Tens($E) + 1)) ; convert From Twos To Tens And Add 1 For sign bit
Else
Return Tens($E); convert From Twos To Tens 
EndIf
Case StringStripWS($value, 8) <> ''
If ($value1 < 0 And $value2 < 0) Then; sign bit bitwise And (signbit ,signbit) / (1 And 1) = 1
$A = (- (Tens($E) + 1));; convert From Twos To Tens And Add 1 For sign bit
Else
$A = (Tens($E)); convert From Twos To Tens  // No sign bit Or sign bit = 0
EndIf
Bit_AND($A, $value,"")
EndSelect
Else
Return ""
EndIf
EndFunc


Func Bit_OR($value1, $value2 , $value = '')
$BOOL =  IsNumber($value) Or StringStripWS($value, 8) = '' 
if IsNumber($value1) And IsNumber($value2) And ($BOOL) Then
Dim $TXT = "" ,$TXT2 = ""

$A = Twos($value1); convert Form Tens To Twos
$B = Twos($value2); convert Form Tens To Twos

If StringLen($A) > StringLen($B) Then
For $I = 1 To StringLen($A) - StringLen($B) Step 1
Select
Case $value2 >= 0; + value2 Or value2 = 0
$B = "0" & $B
Case $value2 < 0; - value2
$B = "1" & $B
EndSelect
Next
ElseIf StringLen($B) > StringLen($A) Then
For $I = 1 To StringLen($B) - StringLen($A) Step 1
Select
Case $value1 >= 0; + value1 Or value1 = 0
$A =  "0" & $A
Case $value1 < 0; - value2
$A = "1" & $A
EndSelect
Next
EndIf
$A = StringSplit($A,"")
$B = StringSplit($B,"")
for $I = $A[0] To 1 Step -1
Select 
Case ($value1 < 0 And $value2 >= 0) Or ($value2 < 0 And $value1 >= 0) Or ($value1 < 0 And $value2 < 0) 
;Case operation ==> (-,+) Or (+,-) Or (-,-)
; $TXT = IsInt($C) & $TXT; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit Look Func Twos
Select
Case $A[$i] & $B[$i] = '11'
$TXT = '0'
Case $A[$i] & $B[$i] = '00'
$TXT = '1'
Case $A[$i] & $B[$i] = '10'
$TXT = '0'
Case $A[$i] & $B[$i] = '01'
$TXT = '0'
EndSelect
Case Else;operation ==> (+,+) No sign bit 
Select
Case $A[$i] & $B[$i] = '11'
$TXT = '1'
Case $A[$i] & $B[$i] = '00'
$TXT = '0'
Case $A[$i] & $B[$i] = '10'
$TXT = '1'
Case $A[$i] & $B[$i] = '01'
$TXT = '1'
EndSelect
EndSelect
$TXT2 = $TXT & $TXT2
Next
$E = StringSplit($TXT2,"")
Select
Case StringStripWS($value, 8) = ''
If ($value1 < 0 And $value2 >= 0) Or ($value2 < 0 And $value1 >= 0) Or ($value1 < 0 And $value2 < 0) Then 
; sign bit bitwise OR (signbit OR Number) (Number OR signbit) (signbit OR signbit) / (1 OR  1) = 1 / (1 OR  0) = 1 (0 OR  1) = 1 
; $TXT = IsInt($C) & $TXT; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit Look Func Twos
Return (- (Tens($E) + 1)); convert From Twos To Tens And Add 1 For sign bit
Else
Return Tens($E); convert From Twos To Tens // No sign bit Or sign bit = 0
EndIf
Case StringStripWS($value, 8) <> ''
if ($value1 < 0 And $value2 >= 0) Or ($value2 < 0 And $value1 >= 0) Or ($value1 < 0 And $value2 < 0) Then 
; sign bit bitwise OR (signbit OR Number) (Number OR signbit) (signbit ,signbit) / (1 OR  1) = 1 / (1 OR  0) = 1 (0 OR  1) = 1 / (0 OR  0) = 1
; $TXT = IsInt($C) & $TXT; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit Look Func Twos
$A = (- (Tens($E) + 1)); convert From Twos To Tens And Add 1 For sign bit
Else
$A = (Tens($E)); convert From Twos To Tens //No sign bit 
EndIf
Bit_OR($A, $value,"")
EndSelect
Else
Return ""
EndIf
EndFunc




Func Bit_XOR($value1, $value2 , $value = '')
$BOOL =  IsNumber($value) Or StringStripWS($value, 8) = '' 
if IsNumber($value1) And IsNumber($value2) And ($BOOL) Then
Dim $TXT = "" ,$TXT2 = ""

$A = Twos($value1); convert Form Tens To Twos
$B = Twos($value2); convert Form Tens To Twos

If StringLen($A) > StringLen($B) Then
For $I = 1 To StringLen($A) - StringLen($B) Step 1
Select
Case $value2 >= 0; + value2 Or value2 = 0
$B = "0" & $B
Case $value2 < 0; - value2
$B = "1" & $B
EndSelect
Next
ElseIf StringLen($B) > StringLen($A) Then
For $I = 1 To StringLen($B) - StringLen($A) Step 1
Select
Case $value1 >= 0; + value1 Or value1 = 0
$A =  "0" & $A
Case $value1 < 0; - value2
$A = "1" & $A
EndSelect
Next
EndIf

$A = StringSplit($A,"")
$B = StringSplit($B,"")

for $I = $A[0] To 1 Step -1
Select 
Case ($value1 < 0 And $value2 > 0) Or ($value2 < 0 And $value1 > 0)
;Case operation ==> (-,+) Or (+,-) 
; $TXT = IsInt($C) & $TXT; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit Look Func Twos
Select
Case $A[$i] & $B[$i] = '11'
$TXT = '1'
Case $A[$i] & $B[$i] = '00'
$TXT = '1'
Case $A[$i] & $B[$i] = '10'
$TXT = '0'
Case $A[$i] & $B[$i] = '01'
$TXT = '0'
EndSelect
Case Else;operation ==> (+,+) (-,-) // No sign bit Or sign bit = 0
Select
Case $A[$i] & $B[$i] = '11'
$TXT = '0'
Case $A[$i] & $B[$i] = '00'
$TXT = '0'
Case $A[$i] & $B[$i] = '10'
$TXT = '1'
Case $A[$i] & $B[$i] = '01'
$TXT = '1'
EndSelect
EndSelect
$TXT2 = $TXT & $TXT2
Next
$E = StringSplit($TXT2,"")
Select
Case StringStripWS($value, 8) = ''
If ($value1 < 0 And $value2 > 0) Or ($value2 < 0 And $value1 > 0) Then 
; sign bit bitwise exclusive OR (signbit XOR Number) (Number XOR signbit)  (1 XOR 0) = 1 (0 XOR 1) = 1 
; $TXT = IsInt($C) & $TXT; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit Look Func Twos
Return (- (Tens($E) + 1)); convert From Twos To Tens And Add 1 For sign bit
Else
Return Tens($E)
EndIf
Case StringStripWS($value, 8) <> ''
If  ($value1 < 0 And $value2 > 0) Or ($value2 < 0 And $value1 > 0) Then 
; sign bit bitwise exclusive OR (signbit XOR Number) (Number XOR signbit)  (1 XOR 0) = 1 (0 XOR 1) = 1 
; $TXT = IsInt($C) & $TXT; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit Look Func Twos
$A = (- (Tens($E) + 1)); convert From Twos To Tens And Add 1 For sign bit
Else
$A = (Tens($E)); convert From Twos To Tens //No sign bit Or sign bit = 0
EndIf
Bit_XOR($A, $value,"")
EndSelect
Else
Return ""
EndIf
EndFunc


Func Twos($A); convert Form Tens To Twos 
$C = $A
if($A < 0) Then $C = (abs($A) - 1); -A = (+A - 1) Look bitwise NOT
$TXT = ""
Do
$C = (int($C) / 2); / int($C)
if($A < 0) Then; if -A
$TXT = IsInt($C) & $TXT; convert Form Tens (+A - 1) = -A To Twos + A with Out sign bit
ElseIf ($A >= 0) Then; ElseIf + A Or 0
$TXT = IsFloat($C) & $TXT; convert Form +A To Twos +A
EndIf
Until(Int($C) < 1)
MsgBox(0,"",$TXT)
Return $TXT
EndFunc


Func Tens($B); convert From Twos To Tens
$D =0
$C =0
for $I = $B[0] To 1 Step -1
$D += ($B[$I] * POW(2 , $C)); convert From Twos To Tens
$C +=1 
Next
Return $D
EndFunc

Func POW($X , $Y)
$Z = 1
For $I = 1 To $Y  Step 1
$Z *= $X
Next
Return $Z
EndFunc

Wolf_Oman

صرح السماء

wolf9228

ناقوس الخطر

مواضيع مشابهة