编程实现表1(L的输入-输出模式分布),证实表1的正确性
生活随笔
收集整理的這篇文章主要介紹了
编程实现表1(L的输入-输出模式分布),证实表1的正确性
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
public class Main4 {//定義輸入字的長度,根據(jù)題意,長度為8,也就是用8個16進制的數(shù)來表示一個字public static int WORD_STRING_LENGTH=8;//一個字占32bit,用32位二進制數(shù)來表示public static int BIT_LIST_LENGTH=4*WORD_STRING_LENGTH;//定義二進制與十進制對應(yīng)的數(shù)組public static int PATTERN_LENGTH=16;public static String[] bitList={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};public static String hexList="0123456789abcdef";public static void main(String[] args) {System.out.println("運行時間達七小時,請耐心等候…………");String [][] distribution=new String [PATTERN_LENGTH][PATTERN_LENGTH];distribution=getDistribution(PATTERN_LENGTH);printResult(distribution);}/*該方法實現(xiàn)線性變換模塊。要求:用戶輸入一個用16進制表示的數(shù)字(例如 1a2b3c4d)程序輸出相應(yīng)的用16進制表示的字*/private static String getResult(String str){int[] B=new int[BIT_LIST_LENGTH];//用于存儲輸入字轉(zhuǎn)為二進制的數(shù)int[] LB=new int[BIT_LIST_LENGTH];//用于存儲得到的二進制結(jié)果String LB_16="";//用于存儲得到的十六進制結(jié)果//進行一次循環(huán),將輸入的十六進制的數(shù)轉(zhuǎn)化為二進制的數(shù)for(int i=0;i<WORD_STRING_LENGTH;i++){int k=Integer.valueOf(str.substring(i,i+1),16);for(int j=0;j<4;j++){B[4*i+j]=bitList[k].charAt(j)-48;}}//進行線性變換操作for(int p=0;p<BIT_LIST_LENGTH;p++){LB[p]=B[p]^B[(p+2)%BIT_LIST_LENGTH]^B[(p+10)%BIT_LIST_LENGTH]^B[(p+18)%BIT_LIST_LENGTH]^B[(p+24)%BIT_LIST_LENGTH];}//將二進制的數(shù)轉(zhuǎn)換為十六進制的數(shù)for(int x=0;x<WORD_STRING_LENGTH;x++){String temp="";for(int y=0;y<4;y++){temp+=LB[x*4+y];}LB_16+=Integer.toHexString(Integer.parseInt(temp, 2));}return LB_16;}/*輸入兩個十進制的數(shù),返回兩個十六進制的數(shù)組成的字符串*/private static String getTwoHex(int i,int j){String str= hexList.substring(i,i+1)+hexList.substring(j,j+1);return str;}/*定義了模式函數(shù),輸入的是一個字,四個字節(jié),八個十六進制的數(shù),每兩個十六進制的數(shù)為一個字節(jié),如果兩個字節(jié)的數(shù)都為0,則該字節(jié)為零對輸入的四個字節(jié)進行判斷,如果該字節(jié)為0則用一個0定義該字節(jié),如果該字節(jié)不為0,則用1定義該字節(jié)例如輸入:00001a2b ,則輸出為:0011*/private static String pattern(String str){String pat="";for (int i=0;i<str.length()/2;i++){if(str.substring(2*i,2*(i+1)).equals("00")||str.substring(2*i,2*(i+1))=="00"){pat+="0";}else {pat+="1";}}return pat;}private static String[][] getDistribution(int n){long sum[]=new long[n+1];long count[][]=new long[n+1][n+1];String result[][]=new String [n+1][n+1];//對每一種情況進行操作,操作時候可以將情況分為4類for(int x=1;x<n;x++){int item=getItem(x);switch (item){case 1://只包含一個1的情況for (int i = 0; i <16; i++) {for (int j = 0; j < 16; j++) {if (!(i == 0 && j == 0)){sum[x]++;String twoHex1 = getTwoHex(i, j);String str= "000000" + twoHex1;String pat=pattern(getResult(str));int index=Integer.parseInt(pat, 2);count[x][index]++;}}}break;case 2://包含兩個1的情況for (int i = 0; i < 16; i++) {for (int j = 0; j < 16; j++) {for (int k = 0; k < 16; k++) {for (int l = 0; l < 16; l++) {if (!((i == 0 && j == 0) || (l == 0 && k == 0) )) {sum[x]++;String twoHex1 = getTwoHex(i, j);String twoHex2 = getTwoHex(k, l);String str = "0000" + twoHex1 + twoHex2;String pat = pattern(getResult(str));int index = Integer.parseInt(pat, 2);count[x][index]++;}}}}}break;case 3://包含三個1的情況for (int i = 0; i < 16; i++) {for (int j = 0; j < 16; j++) {for (int k = 0; k < 16; k++) {for (int l = 0; l < 16; l++) {for (int a = 0; a < 16; a++) {for (int b = 0; b < 16; b++) {if (!((i == 0 && j == 0) || (l == 0 && k == 0) || (a == 0 && b == 0))) {sum[x]++;String twoHex1 = getTwoHex(i, j);String twoHex2 = getTwoHex(k, l);String twoHex3 = getTwoHex(a, b);String str = "00" + twoHex1 + twoHex2 + twoHex3;String pat=pattern(getResult(str));int index=Integer.parseInt(pat, 2);count[x][index]++;}}}}}}}break;case 4://包含四個1的情況for (int i = 0; i < 16; i++) {for (int j = 0; j < 16; j++) {for (int k = 0; k < 16; k++) {for (int l = 0; l < 16; l++) {for (int a = 0; a< 16; a++) {for (int b = 0; b< 16; b++) {for (int p = 0; p < 16; p++) {for (int q = 0; q < 16; q++) {if (!((i == 0 && j == 0) || (l == 0 && k == 0) ||(a == 0 && b == 0)||(p == 0 && q == 0))){sum[x]++;String twoHex1 = getTwoHex(i, j);String twoHex2 = getTwoHex(k, l);String twoHex3 = getTwoHex(a, b);String twoHex4 = getTwoHex(p, q);String str = twoHex1 + twoHex2 + twoHex3+ twoHex4;String pat=pattern(getResult(str));int index=Integer.parseInt(pat, 2);count[x][index]++;}}}}}}}}}break;}}for(int r=0;r<=n;r++){for(int s=0;s<=n;s++){if(count[r][s]==0){result[r][s]="0";}else{result[r][s]=String.valueOf(count[r][s]/255)+"/"+sum[r]/255;}}}return result;}/*給出十進制的數(shù),判斷其四位二進制數(shù)中1的個數(shù)*/private static int getItem(int x){String str=bitList[x];int count=0;for(int i=0;i<4;i++){if(str.charAt(i)=='1'){count++;}}return count;}private static void printResult(String[][] list){int[] sequence={0,1,2,4,8,3,5,6,9,10,12,7,11,13,14,15};System.out.printf("%-5s"," ");for(int i=1;i<list.length-1;i++){String str=bitList[sequence[i]];System.out.printf("%-20s",str);}System.out.println();for(int r=1;r<list.length-1;r++) {System.out.printf("%-5s",bitList[sequence[r]]);for (int s = 1; s < list.length-1; s++) {String str=list[sequence[r]][sequence[s]];System.out.printf("%-20s",str);}System.out.println();}}}
總結(jié)
以上是生活随笔為你收集整理的编程实现表1(L的输入-输出模式分布),证实表1的正确性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: F2上的8×8可逆矩阵的个数为2的62次
- 下一篇: (8)操作系统安全机制之二