প্রদত্ত নম্বরটি সিতে সমান বা বিজোড় কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?
প্রদত্ত নম্বরটি সিতে সমান বা বিজোড় কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?
উত্তর:
2 দ্বারা বিভাজক করার সময় অবশিষ্ট রয়েছে কিনা তা পরীক্ষা করতে মডুলো (%) অপারেটরটি ব্যবহার করুন:
if (x % 2) { /* x is odd */ }
কয়েক জন আমার উপরের উত্তরটির সমালোচনা করে বলেছেন যে x & 1 ব্যবহার করা "দ্রুত" বা "আরও দক্ষ"। আমি এটি বিশ্বাস করি না।
কৌতূহলের বাইরে আমি দুটি তুচ্ছ পরীক্ষার কেস প্রোগ্রাম তৈরি করেছি:
/* modulo.c */
#include <stdio.h>
int main(void)
{
int x;
for (x = 0; x < 10; x++)
if (x % 2)
printf("%d is odd\n", x);
return 0;
}
/* and.c */
#include <stdio.h>
int main(void)
{
int x;
for (x = 0; x < 10; x++)
if (x & 1)
printf("%d is odd\n", x);
return 0;
}
এরপরে আমি আমার মেশিনে 5 টি ভিন্ন সময়ে জিসিসি 4.1.3 দিয়ে এগুলি সংকলন করেছি:
আমি প্রতিটি সংকলনের (জিসিসি-এস ব্যবহার করে) বিধানসভা আউটপুট পরীক্ষা করে দেখেছি যে প্রতিটি ক্ষেত্রে and.c এবং modulo.c এর আউটপুট অভিন্ন ছিল (তারা উভয়ই andl $ 1,% eax নির্দেশ ব্যবহার করেছিল)। আমি সন্দেহ করি এটি একটি "নতুন" বৈশিষ্ট্য, এবং আমার সন্দেহ হয় যে এটি প্রাচীন সংস্করণগুলির সাথে সম্পর্কিত। আমি যে কোনও আধুনিককে (বিগত 20 বছরে তৈরি) সন্দেহ করি নন-আরকেন সংকলক, বাণিজ্যিক বা উন্মুক্ত উত্সে, এমন অপ্টিমাইজেশনের অভাব রয়েছে। আমি অন্যান্য সংকলকগুলিতে পরীক্ষা করতাম, তবে এই মুহুর্তে আমার কোনও উপলব্ধ নেই।
অন্য কেউ যদি অন্য সংকলক এবং / অথবা প্ল্যাটফর্মের লক্ষ্যগুলি পরীক্ষা করতে যত্নবান হন এবং অন্যরকম ফলাফল পান তবে আমি এটি জানতে আগ্রহী।
পরিশেষে, স্বাক্ষরকৃত পূর্ণসংখ্যার বাস্তবায়নের উপস্থাপনা নির্বিশেষে পূর্ণসংখ্যাটি ধনাত্মক, negativeণাত্মক বা শূন্য কিনা তা কার্যকর করার জন্য মানক দ্বারা মডুলো সংস্করণটি গ্যারান্টিযুক্ত । বিটওয়াইস-এবং সংস্করণটি নয়। হ্যাঁ, আমি বুঝতে পারি যে দুটির পরিপূরক কিছুটা সর্বব্যাপী, সুতরাং এটি আসলে কোনও সমস্যা নয়।
আপনি ছেলেরা খুব দক্ষ। আপনি যা চান তা হ'ল:
public boolean isOdd(int num) {
int i = 0;
boolean odd = false;
while (i != num) {
odd = !odd;
i = i + 1;
}
return odd;
}
জন্য পুনরাবৃত্তি isEven
।
অবশ্যই, এটি নেতিবাচক সংখ্যার জন্য কাজ করে না। তবে তেজ নিয়ে ত্যাগ হয় ...
বিট গাণিতিক ব্যবহার করুন:
if((x & 1) == 0)
printf("EVEN!\n");
else
printf("ODD!\n");
এটি বিভাগ বা মডুলাস ব্যবহারের চেয়ে দ্রুত।
[জোক মোড = "চালু"]
public enum Evenness
{
Unknown = 0,
Even = 1,
Odd = 2
}
public static Evenness AnalyzeEvenness(object o)
{
if (o == null)
return Evenness.Unknown;
string foo = o.ToString();
if (String.IsNullOrEmpty(foo))
return Evenness.Unknown;
char bar = foo[foo.Length - 1];
switch (bar)
{
case '0':
case '2':
case '4':
case '6':
case '8':
return Evenness.Even;
case '1':
case '3':
case '5':
case '7':
case '9':
return Evenness.Odd;
default:
return Evenness.Unknown;
}
}
[জোক মোড = "অফ"]
সম্পাদনা: এনামগুলিতে বিভ্রান্তিকর মান যুক্ত হয়েছে।
জবাবে ffpf - আমি ঠিক সহকর্মীর সাথে একই যুক্তি বছর পূর্বে ছিল, এবং উত্তর কোন এটি ঋণাত্মক সংখ্যা সাথে কাজ করে না।
সি স্ট্যান্ডার্ড নির্ধারণ করে যে negativeণাত্মক সংখ্যাগুলি 3 উপায়ে উপস্থাপন করা যেতে পারে:
এটি পরীক্ষা করা হচ্ছে:
isEven = (x & 1);
2 এর পরিপূরক এবং সাইন এবং প্রস্থের প্রতিনিধিত্বের জন্য কাজ করবে তবে 1 এর পরিপূরক নয়।
তবে আমি বিশ্বাস করি যে নিম্নলিখিত সকল ক্ষেত্রে কাজ করবে:
isEven = (x & 1) ^ ((-1 & 1) | ((x < 0) ? 0 : 1)));
পাঠ্য বাক্সটি চরিত্রের চেয়ে আমার চেয়ে কম পরে সমস্ত খাচ্ছে বলে উল্লেখ করার জন্য এফএফপিএফকে ধন্যবাদ!
সুন্দর একটি হ'ল:
/*forward declaration, C compiles in one pass*/
bool isOdd(unsigned int n);
bool isEven(unsigned int n)
{
if (n == 0)
return true ; // I know 0 is even
else
return isOdd(n-1) ; // n is even if n-1 is odd
}
bool isOdd(unsigned int n)
{
if (n == 0)
return false ;
else
return isEven(n-1) ; // n is odd if n-1 is even
}
নোট করুন যে এই পদ্ধতিতে দুটি ফাংশন জড়িত লেজ পুনরাবৃত্তি ব্যবহার করুন। যদি আপনার সংকলক স্কিম সংকলকের মতো লেজ পুনরাবৃত্তি সমর্থন করে তবে এটি দক্ষতার সাথে প্রয়োগ করা যেতে পারে (কিছুক্ষণের মধ্যে / এক ধরণের লুপ পর্যন্ত রূপান্তরিত)। এই ক্ষেত্রে স্ট্যাকের উপচে পড়া উচিত নয়!
একটি সংখ্যা এমনকি দুটি, যখন দুটি দ্বারা বিভাজন করা হয়, তখন বাকী 0 হয় A একটি সংখ্যাটি বিজোড় হয় যখন 2 দ্বারা বিভাজিত হয়, অবশিষ্ট 1 হয়।
// Java
public static boolean isOdd(int num){
return num % 2 != 0;
}
/* C */
int isOdd(int num){
return num % 2;
}
পদ্ধতিগুলি দুর্দান্ত!
i % 2 == 0
আমি এটিকে কেবল 2 দিয়ে ভাগ করব এবং যদি 0 টি বাকী থাকে তবে এটি সমান, অন্যথায় এটি অদ্ভুত।
মডিউলাস (%) ব্যবহার করা এটি সহজ করে তোলে।
যেমন। 4% 2 = 0 অতএব 4 টি 5% 2 = 1 তাই 5 টি বিজোড়
সমস্যার আরও একটি সমাধান
(শিশুরা ভোট দেওয়ার ক্ষেত্রে স্বাগত জানায়)
bool isEven(unsigned int x)
{
unsigned int half1 = 0, half2 = 0;
while (x)
{
if (x) { half1++; x--; }
if (x) { half2++; x--; }
}
return half1 == half2;
}
আমি পূর্ণসংখ্যার পার্টির একটি টেবিল (0 এমনকি যদি বিজোড় হলেও 1) তৈরি করব (সুতরাং কেউ একটি অনুসন্ধান করতে পারে: ডি), তবে জিসিসি আমাকে এই আকারের অ্যারে করতে দেয় না:
typedef unsigned int uint;
char parity_uint [UINT_MAX];
char parity_sint_shifted [((uint) INT_MAX) + ((uint) abs (INT_MIN))];
char* parity_sint = parity_sint_shifted - INT_MIN;
void build_parity_tables () {
char parity = 0;
unsigned int ui;
for (ui = 1; ui <= UINT_MAX; ++ui) {
parity_uint [ui - 1] = parity;
parity = !parity;
}
parity = 0;
int si;
for (si = 1; si <= INT_MAX; ++si) {
parity_sint [si - 1] = parity;
parity = !parity;
}
parity = 1;
for (si = -1; si >= INT_MIN; --si) {
parity_sint [si] = parity;
parity = !parity;
}
}
char uparity (unsigned int n) {
if (n == 0) {
return 0;
}
return parity_uint [n - 1];
}
char sparity (int n) {
if (n == 0) {
return 0;
}
if (n < 0) {
++n;
}
return parity_sint [n - 1];
}
সুতরাং এর পরিবর্তে এর পরিবর্তে সমান এবং বিজোড় এর গাণিতিক সংজ্ঞাটি অবলম্বন করি।
একটি পূর্ণসংখ্যা n এর মধ্যে একটি পূর্ণসংখ্যা k উপস্থিত থাকলেও এন = 2 কে থাকে।
একটি পূর্ণসংখ্যা n এর মধ্যে বিজোড় হয় যদি এমন একটি পূর্ণসংখ্যা k থাকে যেমন এন = 2 কে + 1।
এটির জন্য কোডটি এখানে:
char even (int n) {
int k;
for (k = INT_MIN; k <= INT_MAX; ++k) {
if (n == 2 * k) {
return 1;
}
}
return 0;
}
char odd (int n) {
int k;
for (k = INT_MIN; k <= INT_MAX; ++k) {
if (n == 2 * k + 1) {
return 1;
}
}
return 0;
}
সি-পূর্ণসংখ্যা int
প্রদত্ত সি সংকলনের সম্ভাব্য মানগুলি চিহ্নিত করতে দিন । (দ্রষ্টব্য যে সি-পূর্ণসংখ্যাগুলি পূর্ণসংখ্যার একটি উপসেট।)
এখন কেউ চিন্তিত হতে পারে যে সি-ইন্টিজারে প্রদত্ত এন এর জন্য সি-ইন্টিজারের মধ্যে সংশ্লিষ্ট পূর্ণসংখ্যার কে উপস্থিত থাকতে পারে না। তবে একটি সামান্য প্রমাণের সাহায্যে এটি দেখানো যেতে পারে যে সমস্ত পূর্ণসংখ্যার জন্য এন, | এন | <= | 2 এন | (*), যেখানে | এন | "n যদি এন ইতিবাচক এবং অন্যথায় -n হয়" হয়। অন্য কথায়, পূর্ণসংখ্যায় সমস্ত এন এর জন্য নিম্নলিখিতগুলির মধ্যে কমপক্ষে একটি হোল্ড করে (ঠিক হয় কেস (1 এবং 2) বা কেস (3 এবং 4) বাস্তবে তবে আমি এটি এখানে প্রমাণ করব না):
কেস 1: এন <= 2 এন।
কেস 2: -ন <= -2 এন।
কেস 3: -ন <= 2 এন।
কেস 4: এন <= -2 এন।
এখন 2 কে = এন নিন। (N এর সমান থাকলে এরকম আক অস্তিত্ব রাখে তবে আমি এখানে এটি প্রমাণ করব না n n যদি তা না হয় তবে লুপটি যে even
কোনও উপায়ে তাড়াতাড়ি ফিরে আসতে ব্যর্থ হয়, তাই এটি কিছু যায় আসে না)) তবে এটি বোঝায় কে <এন যদি এন 0 দ্বারা (*) এবং এটি সত্য নয় (এখানে আবার প্রমাণিত হয় না) যে সমস্ত মিটারের জন্য, 2 মি = z ইঙ্গিতগুলিতে এম দেওয়া এম এর সমান নয় z 0 বোঝায় না। ক্ষেত্রে এন 0, 2 * 0 = 0 সুতরাং 0 টি এমনকি আমাদের হয়ে গেছে (যদি n = 0 হয় তবে 0 সি-ইন্টিজারে থাকে কারণ এন ফাংশনে সি-ইন্টিজারে থাকে even
, তাই কে = 0 সি-ইন্টিজারে থাকে)। সুতরাং সি-পূর্ণসংখ্যার এ জাতীয় আকৃতি সি-ইন্টিজারে n এর জন্য উপস্থিত থাকে n
একটি অনুরূপ যুক্তি দেখায় যে n টি বিজোড় হলে সি-ইন্টিজারে আক থাকে যেমন এন = 2 কে + 1।
সুতরাং এখানে উপস্থাপিত even
এবং odd
উপস্থাপিত সমস্ত সি-পূর্ণসংখ্যার জন্য সঠিকভাবে কাজ করবে।
i % 2
এটি অনেক ছোট এবং সম্ভবত আরও দক্ষ।
%2
সমস্ত পূর্ণসংখ্যার জন্য কাজ করে।
// C#
bool isEven = ((i % 2) == 0);
typedef
বা #define
বা কিছু।
এটা চেষ্টা কর: return (((a>>1)<<1) == a)
উদাহরণ:
a = 10101011
-----------------
a>>1 --> 01010101
a<<1 --> 10101010
b = 10011100
-----------------
b>>1 --> 01001110
b<<1 --> 10011100
বরং এই বিনোদনমূলক আলোচনাটি পড়ে আমার মনে পড়ে যে আমার একটি বাস্তব-বিশ্ব, সময় সংবেদনশীল ফাংশন ছিল যা মূল লুপের মধ্যে বিজোড় এবং এমনকি সংখ্যার জন্য পরীক্ষা করে। এটি একটি পূর্ণসংখ্যা শক্তি ফাংশন, স্ট্যাক ওভারফ্লোতে অন্য কোথাও পোস্ট করা হয়েছে। মানদণ্ডগুলি বেশ অবাক করে দিয়েছিল। কমপক্ষে এই আসল-ওয়ার্ল্ড ফাংশনে, মডুলো ধীর এবং উল্লেখযোগ্যভাবে তাই। বিজয়ী, একটি বিস্তৃত মার্জিন দ্বারা, mod 67% মডুলোর সময় প্রয়োজন, এটি বা (|) পদ্ধতির হয় এবং এই পৃষ্ঠায় অন্য কোথাও খুঁজে পাওয়া যায় না।
static dbl IntPow(dbl st0, int x) {
UINT OrMask = UINT_MAX -1;
dbl st1=1.0;
if(0==x) return (dbl)1.0;
while(1 != x) {
if (UINT_MAX == (x|OrMask)) { // if LSB is 1...
//if(x & 1) {
//if(x % 2) {
st1 *= st0;
}
x = x >> 1; // shift x right 1 bit...
st0 *= st0;
}
return st1 * st0;
}
300 মিলিয়ন লুপের জন্য, মাপের সময়টি নিম্নরূপ।
3.962 the | এবং মুখোশ পদ্ধতির
4.851 & পদ্ধতির
5.850% পদ্ধতির
যে সমস্ত লোক তত্ত্ব বা সংসদীয় ভাষার তালিকা ভাবেন তাদের পক্ষে এই জাতীয় যুক্তি নিষ্পত্তি করে, এটি একটি সাবধানতা অবলম্বনকারী গল্প হওয়া উচিত। স্বর্গে ও পৃথিবীতে আরও কিছু রয়েছে, হোরেটিও, আপনার দর্শনে যে স্বপ্ন দেখেছেন সেগুলি তার চেয়েও বেশি।
unsigned x
হিসাবে হিসাবে ব্যবহার করা ভাল । অস্পষ্ট কেন এবং বিভিন্ন ধরণের। একটি পরীক্ষা ব্যবহার করে পুনরায় লেখার পক্ষে যথেষ্ট সহজ । x = x >> 1;
x < 0
x
OrMask
while(x)
% 2
বিটওয়াইজ ব্যবহার করে কেসটি সঙ্কলন করতে যথেষ্ট স্মার্ট হওয়া উচিত &
। আমি কেবল এটি পরীক্ষা করেছি এবং ফলাফলগুলি সম্পূর্ণরূপে একই (ভিএস ২০১৫, এক্স x86 এবং x64 উভয়ই সমস্ত অপ্টিমাইজেশনের সাথে প্রকাশ করে)। গৃহীত উত্তরটি জিসিসির পক্ষে এটিও জানিয়েছে (২০০৮ সালে লিখিত)।
or
চেয়ে and
কিছুটা দ্রুততর হবে তার সম্ভাবনা খুব কমই। এমন কোনও অদ্ভুত প্ল্যাটফর্ম / সংকলক কম্বো থাকলেও (এবং আপনি যেটি বা বেনমার্ক সঞ্চালনের জন্য ব্যবহৃত কোডটি পোস্ট করেননি), অন্য সংকলকগুলির সাথে একই আচরণ করার উপর নির্ভর করে এটি একটি দুর্বল অপ্টিমাইজেশন বাজি হবে। সুতরাং, আমি যেমন লিখেছি, আমি আশ্চর্য হয়েছি যে এটি কোন প্ল্যাটফর্ম / সংকলকটিতে পরীক্ষা করা হয়েছিল , কারণ আমি প্রায় নিশ্চিত যে এটি সঠিকভাবে পরিমাপ করা হয়নি।
এটি তার উত্তর সম্পর্কে @ রকেটরোয়ের সাথে আলোচনার ফলোআপ , তবে যারা এই ফলাফলগুলি তুলনা করতে চান তাদের পক্ষে এটি কার্যকর হতে পারে।
tl; dr আমি যা দেখেছি, তার থেকে রায়ের দৃষ্টিভঙ্গি ( (0xFFFFFFFF == (x | 0xFFFFFFFE)
) পদ্ধতির x & 1
হিসাবে সম্পূর্ণরূপে অনুকূল নয় mod
, তবে অনুশীলনের ক্ষেত্রে চলমান সময়গুলি সকল ক্ষেত্রে সমান হয়ে উঠতে হবে।
সুতরাং, প্রথমে আমি কম্পাইলার এক্সপ্লোরার ব্যবহার করে সংকলিত আউটপুট তুলনা করেছি :
কার্যাদি পরীক্ষা করা:
int isOdd_mod(unsigned x) {
return (x % 2);
}
int isOdd_and(unsigned x) {
return (x & 1);
}
int isOdd_or(unsigned x) {
return (0xFFFFFFFF == (x | 0xFFFFFFFE));
}
-ও 3 সহ ক্লাং 3.9.0:
isOdd_mod(unsigned int): # @isOdd_mod(unsigned int)
and edi, 1
mov eax, edi
ret
isOdd_and(unsigned int): # @isOdd_and(unsigned int)
and edi, 1
mov eax, edi
ret
isOdd_or(unsigned int): # @isOdd_or(unsigned int)
and edi, 1
mov eax, edi
ret
ওসি 3 সহ জিসিসি 6.2:
isOdd_mod(unsigned int):
mov eax, edi
and eax, 1
ret
isOdd_and(unsigned int):
mov eax, edi
and eax, 1
ret
isOdd_or(unsigned int):
or edi, -2
xor eax, eax
cmp edi, -1
sete al
ret
ক্লাং-এর কাছে হ্যাটস, এটি বুঝতে পেরেছিল যে তিনটি ক্ষেত্রেই কার্যত সমান। যাইহোক, রায়ের দৃষ্টিভঙ্গি জিসিসিতে অনুকূলিত হয়নি, তাই ওয়াইএমএমভি।
ভিজ্যুয়াল স্টুডিওর সাথে এটি একই রকম; এই তিনটি ফাংশনের জন্য বিচ্ছিন্নতা প্রকাশ x64 (VS2015) পরিদর্শন করে আমি দেখতে পেলাম যে তুলনার অংশটি "মোড" এবং "এবং" কেসের জন্য সমান এবং রায়ের "বা" কেসের জন্য কিছুটা বড়:
// x % 2
test bl,1
je (some address)
// x & 1
test bl,1
je (some address)
// Roy's bitwise or
mov eax,ebx
or eax,0FFFFFFFEh
cmp eax,0FFFFFFFFh
jne (some address)
যাইহোক, এই তিনটি অপশনের তুলনায় প্রকৃত মানদণ্ড চালানোর পরে (প্লেইন মোড, বিটওয়াইস বা, বিটওয়াইস এবং) ফলাফলগুলি সম্পূর্ণ সমান (আবার, ভিজ্যুয়াল স্টুডিও 2005 x86 / x64, রিলিজ বিল্ড, কোনও ডিবাগার সংযুক্ত নেই)।
রিলিজ অ্যাসেম্বলিটি test
নির্দেশ and
এবং mod
মামলাগুলির জন্য নির্দেশনা ব্যবহার করে , যখন রায়ের cmp eax,0FFFFFFFFh
কেসটি পদ্ধতির ব্যবহার করে তবে এটি ভারীভাবে নিবন্ধিত এবং অনুকূলিত হয় যাতে অনুশীলনে কোনও পার্থক্য নেই।
20 টি রান করার পরে আমার ফলাফল (i7 3610QM, উইন্ডোজ 10 পাওয়ার প্ল্যান হাই পারফরম্যান্সে সেট হয়েছে):
[পরীক্ষা: সমতল মড 2] গড় সময়: 689.29 এমএস (আপেক্ষিক পার্থক্য: + 0.000%) [পরীক্ষা: বিটওয়াইস বা] গড় সময়: 689.63 এমএস (আপেক্ষিক পার্থক্য: + 0.048%) [পরীক্ষা: বিটওয়াইস এবং] গড় সময়: 687.80 এমএস (আপেক্ষিক পার্থক্য: -0.217%)
এই বিকল্পগুলির মধ্যে পার্থক্য 0.3% এর চেয়ে কম, সুতরাং এটি স্পষ্টভাবে স্পষ্ট যে সমস্ত ক্ষেত্রে সমাবেশ সমান।
যদি কেউ চেষ্টা করতে চান তবে কোডটি এখানে রয়েছে, আমি কেবল উইন্ডোজে এটি পরীক্ষা করেছিলাম ( সংজ্ঞার #if LINUX
শর্তসাপেক্ষে পরীক্ষা করুন get_time
এবং প্রয়োজনে এটি প্রয়োগ করুন, এই উত্তর থেকে নেওয়া )।
#include <stdio.h>
#if LINUX
#include <sys/time.h>
#include <sys/resource.h>
double get_time()
{
struct timeval t;
struct timezone tzp;
gettimeofday(&t, &tzp);
return t.tv_sec + t.tv_usec*1e-6;
}
#else
#include <windows.h>
double get_time()
{
LARGE_INTEGER t, f;
QueryPerformanceCounter(&t);
QueryPerformanceFrequency(&f);
return (double)t.QuadPart / (double)f.QuadPart * 1000.0;
}
#endif
#define NUM_ITERATIONS (1000 * 1000 * 1000)
// using a macro to avoid function call overhead
#define Benchmark(accumulator, name, operation) { \
double startTime = get_time(); \
double dummySum = 0.0, elapsed; \
int x; \
for (x = 0; x < NUM_ITERATIONS; x++) { \
if (operation) dummySum += x; \
} \
elapsed = get_time() - startTime; \
accumulator += elapsed; \
if (dummySum > 2000) \
printf("[Test: %-12s] %0.2f ms\r\n", name, elapsed); \
}
void DumpAverage(char *test, double totalTime, double reference)
{
printf("[Test: %-12s] AVERAGE TIME: %0.2f ms (Relative diff.: %+6.3f%%)\r\n",
test, totalTime, (totalTime - reference) / reference * 100.0);
}
int main(void)
{
int repeats = 20;
double runningTimes[3] = { 0 };
int k;
for (k = 0; k < repeats; k++) {
printf("Run %d of %d...\r\n", k + 1, repeats);
Benchmark(runningTimes[0], "Plain mod 2", (x % 2));
Benchmark(runningTimes[1], "Bitwise or", (0xFFFFFFFF == (x | 0xFFFFFFFE)));
Benchmark(runningTimes[2], "Bitwise and", (x & 1));
}
{
double reference = runningTimes[0] / repeats;
printf("\r\n");
DumpAverage("Plain mod 2", runningTimes[0] / repeats, reference);
DumpAverage("Bitwise or", runningTimes[1] / repeats, reference);
DumpAverage("Bitwise and", runningTimes[2] / repeats, reference);
}
getchar();
return 0;
}
আমি জানি এটি কেবল সিনট্যাকটিক চিনি এবং এটি কেবল নেট এ প্রযোজ্য তবে এক্সটেনশন পদ্ধতির কী ...
public static class RudiGroblerExtensions
{
public static bool IsOdd(this int i)
{
return ((i % 2) != 0);
}
}
এখন আপনি নিম্নলিখিত করতে পারেন
int i = 5;
if (i.IsOdd())
{
// Do something...
}
আমি "সৃজনশীল তবে বিভ্রান্তিকর বিভাগ" এ অফার করছি:
int isOdd(int n) { return n ^ n * n ? isOdd(n * n) : n; }
মাইক্রোসফ্ট সি ++ এর সাথে নির্দিষ্ট এই থিমের একটি বৈকল্পিক:
__declspec(naked) bool __fastcall isOdd(const int x)
{
__asm
{
mov eax,ecx
mul eax
mul eax
mul eax
mul eax
mul eax
mul eax
ret
}
}
বিটওয়াস পদ্ধতিটি পূর্ণসংখ্যার অভ্যন্তরীণ উপস্থাপনার উপর নির্ভর করে। একটি মডুলো অপারেটর আছে যেখানেই Modulo কাজ করবে। উদাহরণস্বরূপ, কিছু সিস্টেম প্রকৃতপক্ষে ট্যাগিংয়ের জন্য নিম্ন স্তরের বিটগুলি ব্যবহার করে (ডায়নামিক ভাষাগুলি), তাই কাঁচা এক্স এবং 1 আসলে সেই ক্ষেত্রে কাজ করবে না।
আইওডড (ইন্ট এক্স) {সত্য প্রত্যাবর্তন; }
যথার্থতার প্রমাণ - সমস্ত ধনাত্মক পূর্ণসংখ্যার সেট বিবেচনা করুন এবং ধরুন যে খালি খালি পূর্ণসংখ্যার সেটটি বিজোড় নয়। ধনাত্মক পূর্ণসংখ্যাগুলি সুশৃঙ্খলভাবে তৈরি হওয়ার কারণে, একটি স্বল্পতম নয় বিজোড় সংখ্যা হবে, যা নিজেই বেশ বিজোড়, সুতরাং স্পষ্টভাবে যে সংখ্যাটি সেটে থাকতে পারে না। অতএব এই সেটটি খালি নয় be সবচেয়ে বেশি সংখ্যক নয় বিজোড় সংখ্যাটি বাদে negativeণাত্মক পূর্ণসংখ্যার জন্য পুনরাবৃত্তি করুন।
কিছু লোক যেমন পোস্ট করেছে, এটি করার বিভিন্ন উপায় রয়েছে। এই ওয়েবসাইট অনুসারে , দ্রুততম উপায় হল মডুলাস অপারেটর:
if (x % 2 == 0)
total += 1; //even number
else
total -= 1; //odd number
তবে, এখানে আরও কিছু কোড রয়েছে যা বেঞ্চটি লেখক দ্বারা চিহ্নিত ছিল যা উপরের সাধারণ মডুলাস অপারেশনের চেয়ে ধীর গতিতে চলেছিল:
if ((x & 1) == 0)
total += 1; //even number
else
total -= 1; //odd number
System.Math.DivRem((long)x, (long)2, out outvalue);
if ( outvalue == 0)
total += 1; //even number
else
total -= 1; //odd number
if (((x / 2) * 2) == x)
total += 1; //even number
else
total -= 1; //odd number
if (((x >> 1) << 1) == x)
total += 1; //even number
else
total -= 1; //odd number
while (index > 1)
index -= 2;
if (index == 0)
total += 1; //even number
else
total -= 1; //odd number
tempstr = x.ToString();
index = tempstr.Length - 1;
//this assumes base 10
if (tempstr[index] == '0' || tempstr[index] == '2' || tempstr[index] == '4' || tempstr[index] == '6' || tempstr[index] == '8')
total += 1; //even number
else
total -= 1; //odd number
এমনকি কতজন লোক এমনকি ম্যাথ.সিস্টেম.ডাইভ্রাম পদ্ধতি সম্পর্কে জানত বা তারা কেন এটি ব্যবহার করবে ??
আমাদের মধ্যে যারা আমাদের অধ্যয়নের সময় খুব বেশি বুলিয়ান বীজগণিত করেননি তাদের জন্য বিটওয়াইজ অপারেটর পদ্ধতির উপর আরও বিশদ দেওয়ার জন্য, এখানে একটি ব্যাখ্যা দেওয়া হল। সম্ভবত ওপি তে খুব বেশি কাজে লাগেনি, তবে কেন আমি NUMBER ও 1 কাজ করে তা পরিষ্কার করার মতো মনে হয়েছিল।
দয়া করে নোট করুন যে কেউ যেমন উপরে জবাব দিয়েছেন, negativeণাত্মক সংখ্যাগুলি যেভাবে উপস্থাপন করা হয়েছে তা এই পদ্ধতিটিকে কাজ করা বন্ধ করতে পারে। প্রকৃতপক্ষে এটি এমনকি মডুলো অপারেটর পদ্ধতিটিও ভেঙে ফেলতে পারে যেহেতু প্রতিটি ভাষা কীভাবে এটি নেতিবাচক অপারেশনগুলির সাথে আচরণ করে তার মধ্যে পৃথক হতে পারে।
তবে আপনি যদি জানেন যে NUMBER সর্বদা সদর্থক হয় তবে এটি ভালভাবে কাজ করে।
টুনি উপরোক্ত বিষয়টি যেহেতু বাইনারি (এবং ড্যানারি) এ কেবল শেষ সংখ্যাটি গুরুত্বপূর্ণ।
একটি বুলিয়ান যুক্তি এবং গেট নির্দেশ দেয় যে উভয় ইনপুটগুলি 1 ফেরত দেওয়ার জন্য 1 (বা উচ্চ ভোল্টেজ) হতে হবে।
1 এবং 0 = 0।
0 এবং 1 = 0।
0 এবং 0 = 0।
1 এবং 1 = 1।
আপনি যদি বাইনারি হিসাবে কোনও সংখ্যা উপস্থাপন করেন (আমি এখানে একটি 8 বিট উপস্থাপনা ব্যবহার করেছি), বিজোড় সংখ্যাগুলির শেষে 1 থাকে, এমনকি সংখ্যায় 0 থাকে 0
উদাহরণ স্বরূপ:
1 = 00000001
2 = 00000010
3 = 00000011
4 = 00000100
আপনি যদি কোনও নম্বর নেন এবং বিটওয়াইড এ্যান্ড ব্যবহার করেন (এবং জাভাতে) এটি 1 দ্বারা এটি হয় 00000001, = 1 অর্থাত্ সংখ্যাটি বিজোড়। বা 00000000 = 0, মানে সংখ্যাটি সমান।
যেমন
অদ্ভুত?
1 এবং 1 =
00000001 এবং
00000001 =
00000001 <- বিজোড়
2 এবং 1 =
00000010 এবং
00000001 =
00000000 <- এমনকি
54 এবং 1 =
00000001 এবং
00110110 =
00000000 <- এমনকি
এই কারণেই এটি কাজ করে:
if(number & 1){
//Number is odd
} else {
//Number is even
}
দুঃখিত যদি এটি অপ্রয়োজনীয় হয়।
সংখ্যা শূন্য সমতা | শূন্য http://tinyurl.com/oexhr3k
পাইথন কোড ক্রম।
# defining function for number parity check
def parity(number):
"""Parity check function"""
# if number is 0 (zero) return 'Zero neither ODD nor EVEN',
# otherwise number&1, checking last bit, if 0, then EVEN,
# if 1, then ODD.
return (number == 0 and 'Zero neither ODD nor EVEN') \
or (number&1 and 'ODD' or 'EVEN')
# cycle trough numbers from 0 to 13
for number in range(0, 14):
print "{0:>4} : {0:08b} : {1:}".format(number, parity(number))
আউটপুট:
0 : 00000000 : Zero neither ODD nor EVEN
1 : 00000001 : ODD
2 : 00000010 : EVEN
3 : 00000011 : ODD
4 : 00000100 : EVEN
5 : 00000101 : ODD
6 : 00000110 : EVEN
7 : 00000111 : ODD
8 : 00001000 : EVEN
9 : 00001001 : ODD
10 : 00001010 : EVEN
11 : 00001011 : ODD
12 : 00001100 : EVEN
13 : 00001101 : ODD
আলোচনার খাতিরে ...
এটি সমান বা বিজোড় কিনা তা দেখতে আপনাকে কেবলমাত্র কোনও নির্দিষ্ট সংখ্যার শেষ সংখ্যাটি দেখতে হবে। স্বাক্ষরযুক্ত, স্বাক্ষরবিহীন, ইতিবাচক, নেতিবাচক - এগুলির সাথে তারা সকলেই অভিন্ন। সুতরাং এটি সর্বদাই কাজ করা উচিত: -
void tellMeIfItIsAnOddNumberPlease(int iToTest){
int iLastDigit;
iLastDigit = iToTest - (iToTest / 10 * 10);
if (iLastDigit % 2 == 0){
printf("The number %d is even!\n", iToTest);
} else {
printf("The number %d is odd!\n", iToTest);
}
}
এখানে কীটি কোডের তৃতীয় লাইনে রয়েছে, বিভাগ অপারেটর একটি পূর্ণসংখ্যা বিভাগ সম্পাদন করে, ফলে ফলাফলটি ফলাফলের ভগ্নাংশটি অনুপস্থিত। সুতরাং উদাহরণস্বরূপ 222/10 ফলাফল হিসাবে 22 দেবে। তারপরে এটি 10 এর সাথে আবার গুন করুন এবং আপনার কাছে 220 রয়েছে that এটি মূল 222 থেকে বিয়োগ করুন এবং আপনি 2 দিয়ে শেষ করবেন যা যাদু দ্বারা মূল সংখ্যার শেষ সংখ্যা হিসাবে একই সংখ্যা। ;-) গণনাটি ক্রমটি করা হচ্ছে তার ক্রমটি আমাদের স্মরণ করিয়ে দেওয়ার জন্য প্রথম বন্ধনী রয়েছে First আমরা এগুলি ছেড়ে দিতে পারলাম, যেহেতু অগ্রাধিকারটি বিয়োগ ও গুণনের ক্ষেত্রে বিয়োগের চেয়ে বেশি, তবে এটি আমাদের "আরও পঠনযোগ্য" কোড দেয়।
আমরা চাইলে এগুলি পুরোপুরি অপঠনযোগ্য করে তুলতে পারি। আধুনিক সংকলকটির জন্য এতে কোনও পার্থক্য হবে না: -
printf("%d%s\n",iToTest,0==(iToTest-iToTest/10*10)%2?" is even":" is odd");
তবে ভবিষ্যতে কোডটি বজায় রাখা আরও শক্ত করে তুলবে। কেবল কল্পনা করুন যে আপনি বিজোড় সংখ্যার জন্য পাঠ্যটি "এমনকি নয়" তে পরিবর্তন করতে চান। তারপরে পরে অন্য কেউ আপনি কী পরিবর্তন করেছেন এবং একটি এসএনএন ডিফ বা অনুরূপ সম্পাদন করতে চান ...
আপনি যদি পোর্টেবিলিটি সম্পর্কে চিন্তিত না হন তবে গতি সম্পর্কে আরও বেশি চিন্তিত হন তবে আপনার কমপক্ষে উল্লেখযোগ্য কিছুটা দেখুন। যদি বিটটি 1 তে সেট করা থাকে তবে এটি একটি বিজোড় সংখ্যা, যদি এটি 0 হয় তবে এটি একটি সমান সংখ্যা। সামান্য এডিয়ান সিস্টেমে যেমন ইন্টেলের x86 আর্কিটেকচারটি এটির মতো হবে: -
if (iToTest & 1) {
// Even
} else {
// Odd
}
আপনি যদি দক্ষ হতে চান তবে বিটওয়াইড অপারেটরগুলি ( x & 1
) ব্যবহার করুন তবে আপনি যদি পঠনযোগ্য হতে চান তবে মডুলো 2 ( x % 2
) ব্যবহার করুন
%
। আপনি যদি এটি পঠনযোগ্য হতে চান তবে ব্যবহার করুন %
। হুঁ, আমি এখানে একটি প্যাটার্ন দেখতে পাচ্ছি।
এমনকি বা বিজোড় পরীক্ষা করা একটি সহজ কাজ।
আমরা জানি যে 2 দ্বারা ঠিক বিভাজ্য যে কোনও সংখ্যা অন্য সংখ্যক বিজোড়।
আমাদের কেবল কোনও সংখ্যার বিভাজ্যতা পরীক্ষা করতে হবে এবং বিভাজ্যতা যাচাই করার জন্য আমরা %
অপারেটরটি ব্যবহার করি
অন্যথায় ব্যবহার করে এমনকি বিজোড় পরীক্ষা করা
if(num%2 ==0)
{
printf("Even");
}
else
{
printf("Odd");
}
সি প্রোগ্রাম বা অন্য কোনটি ব্যবহার করে বিজোড় পরীক্ষা করতে
শর্তসাপেক্ষ / তার্নারি অপারেটর ব্যবহার করে
(num%2 ==0) printf("Even") : printf("Odd");
শর্তসাপেক্ষ অপারেটরটি ব্যবহার করে সম বা বিজোড় পরীক্ষা করার জন্য সি প্রোগ্রাম ।
বিটওয়াইস অপারেটর ব্যবহার করে
if(num & 1)
{
printf("Odd");
}
else
{
printf("Even");
}
!(i%2) / i%2 == 0
int isOdd(int n)
{
return n & 1;
}
কোড পূর্ণসংখ্যা শেষ প্রান্তে পরীক্ষা যদি এটা 1 বাইনারি মধ্যে
Binary : Decimal
-------------------
0000 = 0
0001 = 1
0010 = 2
0011 = 3
0100 = 4
0101 = 5
0110 = 6
0111 = 7
1000 = 8
1001 = 9
and so on...
লক্ষ্য করুন যে বিজোড় সংখ্যার জন্য ডানদিকের বিটটি সর্বদা 1 হয় ।
& , bitwise ও অপারেটর চেক আমাদের ডানদিকের বিট রিটার্ন লাইন যদি এটা 1
যখন আমরা n কে 1 এর সাথে 0001
বাইনারি বলতে বোঝায় (শূন্যের সংখ্যা কিছু যায় আসে না)।
তাহলে আসুন কেবল কল্পনা করুন যে আমাদের কাছে 1 বাইট আকারের পূর্ণসংখ্যা n রয়েছে।
এটি 8-বিট / 8-বাইনারি সংখ্যা দ্বারা প্রতিনিধিত্ব করা চাই।
যদি এনটি এন হয় 7 এবং আমরা এটি 1 এর সাথে তুলনা করি , এটি ভালো
7 (1-byte int)| 0 0 0 0 0 1 1 1
&
1 (1-byte int)| 0 0 0 0 0 0 0 1
********************************************
Result | F F F F F F F T
কোন এফ মিথ্যা এবং টি সত্য হিসাবে দাঁড়ায় ।
যদি তারা উভয়ই সত্য হয় তবে এটি কেবলমাত্র সবচেয়ে উপযুক্ত বিটের সাথে তুলনা করে। সুতরাং, স্বয়ংক্রিয়ভাবেই আপনার
7 & 1
হয় টি Rue।
কেবলমাত্র পরিবর্তন n & 1
করতে n & 2
যা 2 প্রতিনিধিত্ব করে 0010
বাইনারি এবং তাই।
আমি হেক্সাডেসিমেল স্বরলিপি ব্যবহার করা হয় তবে আপনি অপারেশন bitwise করার জন্য একটি শিক্ষানবিস করছি সুপারিশ
return n & 1;
>> return n & 0x01;
।