PDA

View Full Version : تولید دو به توان 24 تا جدول که تنها در یک بیت تفاوت دارند



saeidmscs
سه شنبه 25 تیر 1392, 18:47 عصر
سلام
این روزها من دارم روی تحلیل رمز کار میکنم و قصدم اینه با #C کدنویسی رو انجام بدم.
الان،
برای پیدا کردن 5 جدول جانشینی بهینه (که جلوتر مثالی ازش میزنم) باید ابتدا اونها رو تولید کنیم. من مقالات مرتبط با معیارهای یافتن جدول بهینه رو مطالعه کردم اما در پیاده سازی به مشکل برخوردم

اینجا جدول جانشینی یک جدول 2 در 8 (2 زدیف و 8 ستون) هست که در ردیف اول ما اعداد 0 تا 7 رو داریم(تمامی 2بتوان 24 جدول ردیف اول ثابته).
و در ردیف دوم هر جدول،هر عنصر ردیف اول با یک عدد باینری که تنها یک بیت با جدول قبلی تفاوت داره متناظر شده و قراره اعداد 0 تا 7 در خونه های این ردیف جدول قرار بگیرن به شکل زیر:
جدول 1

input 000 001 010 011 100 101 110 111
output 000 000 000 000 000 000 000 000


جدول 2 که تنها یک بیت اون هم در خروجی با جدول 1 تفاوت داره(عدد 1 رو قرار دادیم)


input 000 001 010 011 100 101 110 111
output 001 000 000 000 000 000 000 000



جدول 3 که تنها یک بیت در خروجی با جدول 2 تفاوت داره(عدد 2 رو قرار دادیم)



input 000 001 010 011 100 101 110 111
output 010 000 000 000 000 000 000 000


الی آخرین جدول(جدول 2 بتوان 24 ام)(که در تمام خونه ها عدد 7 قرار داره):


input 000 001 010 011 100 101 110 111
output 111 111 111 111 111 111 111 111

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

tooraj_azizi_1035
سه شنبه 25 تیر 1392, 19:09 عصر
می تونید از ماتریس بیتی استفاده کنید:

توضیح اینکه سطر اول این ماتریس اعداد 0 تا 7 هست و ستون اول هم اعداد 0 تا 7:


public class BitMatrix
{
public BitMatrix(int rowCount, int columnCount)
{
m_RowCount = rowCount;
m_ColumnCount = columnCount;

// Calculate the needed number of bits and bytes
int bitCount = m_RowCount * m_ColumnCount;
int byteCount = bitCount >> 3;
if (bitCount % 8 != 0)
{
byteCount++;
}

// Allocate the needed number of bytes
m_Data = new byte[byteCount];
}

/// <summary>
/// Gets the number of rows in this bit matrix.
/// </summary>
public int RowCount
{
get
{
return m_RowCount;
}
}
/// <summary>
/// Gets the number of columns in this bit matrix.
/// </summary>
public int ColumnCount
{
get
{
return m_ColumnCount;
}
}
/// <summary>
/// Gets/Sets the value at the specified row and column index.
/// </summary>
/// <param name="rowIndex"></param>
/// <param name="columnIndex"></param>
/// <returns></returns>
public bool this[int rowIndex, int columnIndex]
{
get
{
if (rowIndex < 0 || rowIndex >= m_RowCount)
throw new ArgumentOutOfRangeException("rowIndex");

if (columnIndex < 0 || columnIndex >= m_ColumnCount)
throw new ArgumentOutOfRangeException("columnIndex");

int pos = rowIndex * m_ColumnCount + columnIndex;
int index = pos % 8;
pos >>= 3;
return (m_Data[pos] & (1 << index)) != 0;
}
set
{
if (rowIndex < 0 || rowIndex >= m_RowCount)
throw new ArgumentOutOfRangeException("rowIndex");

if (columnIndex < 0 || columnIndex >= m_ColumnCount)
throw new ArgumentOutOfRangeException("columnIndex");

int pos = rowIndex * m_ColumnCount + columnIndex;
int index = pos % 8;
pos >>= 3;
m_Data[pos] &= (byte)(~(1 << index));

if (value)
{
m_Data[pos] |= (byte)(1 << index);
}
}
}

private int m_RowCount;
private int m_ColumnCount;
private byte[] m_Data;
}



منبع: http://www.pvladov.com/2012/05/bit-matrix-in-c-sharp.html


BitMatrix bitMatrix = new BitMatrix(100, 100);
bitMatrix[35, 49] = true;

if (bitMatrix[35, 49])
{
// Do something...
}

saeidmscs
سه شنبه 25 تیر 1392, 19:23 عصر
ممنون
اما بنظرم این چیزی نیست که من عنوان کردم
ما 2 بتوان 24 تا جدول مجزا داریم که قراره روشون تحلیل صورت بگیره
و هر کدوم 2 ردیف و 8 ستون دارن

FastCode
سه شنبه 25 تیر 1392, 20:03 عصر
@tooraj_azizi_1035
کدتون قشنگه و کار میکنه ولی متاسفانه بیش از حد ناکارآمده.
۱.از عملگر % استفاده کردید.یعنی فاجعه
۲.خیلی ساده میتونستید اندازه هر سطر رو byte-aligned کنید و از عملگر * هم جلوگیری کنید.
۳.bound-checking انجام دادید.اینجا C++‎‎ نیست.خود داتنت این کار رو انجام میده و اگر قرار باشه این کار فقط در debug انجام بشه باید از #if debug استفاده کنید.
4 m_Data[pos] &= (byte)(~(1 << index)); باید در else قرار بگیره.بعضی وقتها کامپایلر ها اینقدر که فکر میکنید باهوش نیستند.
۵.واقعا نباید راجع یا constructor چیزی بگم.روش محاسبه طولتون فاجعست.

13601360
سه شنبه 25 تیر 1392, 20:17 عصر
با این کد می تونید تمام 2 به توان 24 جایگشت رو تولید کنید


for (int j = 0; j < Math.Pow(2, 24); j++)
{
Console.WriteLine(Convert.ToString(j, 2).PadLeft(24, '0'));
}

FastCode
چهارشنبه 26 تیر 1392, 00:02 صبح
با این کد می تونید تمام 2 به توان 24 جایگشت رو تولید کنید


for (int j = 0; j < Math.Pow(2, 24); j++)
{
Console.WriteLine(Convert.ToString(j, 2).PadLeft(24, '0'));
}


اجراش کردی ببینی چقدر طول میکشه؟
میتونی خیلی راحت بزاری 16777216 یا مقدار 2^24 رو اول بریزی توی یک متغیر

saeidmscs
چهارشنبه 26 تیر 1392, 12:13 عصر
اجراش کردی ببینی چقدر طول میکشه؟
میتونی خیلی راحت بزاری 16777216 یا مقدار 2^24 رو اول بریزی توی یک متغیر
حالا من برای اینکه جدول داشته باشم(2 بتوان 24 تا جدول) باید هر کدوم ازینها رو به رشته های 3 بیتی تقسیم کنم و بریزم تو یه آرایه 2 بعدی، درسته؟

FastCode
چهارشنبه 26 تیر 1392, 15:08 عصر
من اصلا متوجه نمیشم چرا سه بیت؟
چرا خیلی زیبا بایت هاتون رو به دو nibble تقسیم نمیکنید که محاسباتتون راحتتر بشه؟
آرایه دو بعدی هم لازم نیست.پست آقای tooraj_azizi رو نگاه کنید.ایشون از آرایه یک بعدی استفاده کردن.

13601360
چهارشنبه 26 تیر 1392, 15:58 عصر
حالا من برای اینکه جدول داشته باشم(2 بتوان 24 تا جدول) باید هر کدوم ازینها رو به رشته های 3 بیتی تقسیم کنم و بریزم تو یه آرایه 2 بعدی، درسته؟
مساله من تو درست کردن آرایه ها(به همون شکلی که تو پست اول گفتم) هستش.
الانم که این کد رو اجرا میکنی، میبینی که رشته 24 بیتی میده و من باید گویا بازم روش پردازش انجام بدم تا بتونم بریزم تو آرایه


با Substring می تونید هر رشته 24 بیتی که تولید میشه رو 3 رقم ، 3 رقم جدا کنید