比如int=3,怎么把它轉成16位的陣列{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1}
有沒有直接封裝好的函式?
uj5u.com熱心網友回復:
public static byte[] IntArrToByteArr(int[] intArr){
int intSize = sizeof(int) * intArr.Length;
byte[] bytArr = new byte[intSize];
//申請一塊非托管記憶體
IntPtr ptr = Marshal.AllocHGlobal(intSize);
//復制int陣列到該記憶體塊
Marshal.Copy(intArr, 0, ptr, intArr.Length);
//復制回byte陣列
Marshal.Copy(ptr, bytArr, 0, bytArr.Length);
//釋放申請的非托管記憶體
Marshal.FreeHGlobal(ptr);
return bytArr;
}
uj5u.com熱心網友回復:
static async Task Main(string[] args)
{
int i=3;
var res = GetBit16Low(i).ToList();
}
public static IEnumerable<int> GetBit16Low(int value)
{
short i = (short) value;
BitArray bitArray=new BitArray(BitConverter.GetBytes(i));
for (int j = bitArray.Length-1; j >= 0; j--)
{
yield return Convert.ToInt32(bitArray[j]);
}
}
uj5u.com熱心網友回復:
上面那個是利用微軟現有的功能你要想炫一把手動輪子也行,右移 加位判定
public static IEnumerable<int> GetBit16Low1(int value)
{
int t = 1;
for (int i = 15; i >=0; i--)
{
var t1 = 1 << i;
if ((value | t1) == value)
yield return 1;
else
{
yield return 0;
}
}
}
uj5u.com熱心網友回復:
下面在貼點眼暈的玩意,當然下面兩個你就純粹看看,別當真。只是純粹技巧,而不是技術了1.直接linq
var b= Enumerable.Range(0, 16).Select(p => ((1 << (15 - p) | value) == value) ? 1 : 0);
2.把3樓的改成,普通人一眼看不懂的
public static IEnumerable<int> GetBit16Low1(int value)
{
for (int i = 15,t=1<<i; i >=0; i--,t=t>>1)
{
int r = (value | t) == value ? 1 : 0;
yield return r;
}
}
uj5u.com熱心網友回復:
這個看著懵逼……
uj5u.com熱心網友回復:
還能改成更暈的public static IEnumerable<int> GetBit16Low1(int value)
{
for (int i = 15,t=1<<i,r= (value | t) == value ? 1 : 0; i >=0; i--,t=t>>1, r = (value | t) == value ? 1 : 0)
yield return r;
}
當然一般情況下,你要寫成這樣,估計是要挨罵的,反正我要看見這個codereview我是不給過,我得把人喊進小黑屋讓他自己解釋到底想干嘛,解釋不了。扣績效是跑不了的
uj5u.com熱心網友回復:
對了,就是用BitConverteruj5u.com熱心網友回復:
int[] arr = Convert.ToString(3, 2)
.PadLeft(Marshal.SizeOf(a) * 4, '0')
.ToCharArray()
.Select(ss => int.Parse(ss.ToString()))
.ToArray();
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/275616.html
標籤:C#
