জাভাস্ক্রিপ্ট ফাংশন জাভাতে আবার লিখিত বিভিন্ন ফলাফল দেয়


9

এই জাভাস্ক্রিপ্ট ফাংশনটি রয়েছে যা আমি জাভাতে আবার লেখার চেষ্টা করছি:

function normalizeHash(encondindRound2) {
    if (encondindRound2 < 0) {
        encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
    }
    return encondindRound2 % 1E6;
}

আমার জাভা অভিযোজন:

public long normalizeHash(long encondindRound2) {
        if (encondindRound2 < 0) {
            encondindRound2 = (((int) encondindRound2) & 0x7fffffff) + 0x80000000;
        }
        return (((int) encondindRound2) % 1_000_000);
    }

আমি যখন পাস করি তখন -1954896768জাভাস্ক্রিপ্ট সংস্করণটি ফিরে আসে 70528, যখন জাভা ফিরে আসে -896768। আমি নিশ্চিত না কেন। পরে জাভাস্ক্রিপ্ট ফাংশনে যদি: পার্থক্য যদি শর্ত ভিতরে শুরু বলে মনে হয় encodingRound2 = 2340070528, যখন জাভা: encodingRound2 = -1954896768

এটি অনলাইনে দেখানোর জন্য আমি এই প্রতিবেদনগুলি তৈরি করেছি:

জাভাস্ক্রিপ্ট : https://repl.it/repls/NumbGuiltyHack

জাভা : https://repl.it/repls/ClumsyQualifiedProblem

সম্পাদনা : এটিতে জাভা ফাংশন পরিবর্তন করা হচ্ছে

public long normalizeHash(long encondindRound2) {
        if (encondindRound2 < 0) {
            encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000;
        }
        return (encondindRound2 % 1_000_000);
    }

ফলাফলটি প্রভাবিত করে না বলে মনে হচ্ছে - এটি এখনও রয়েছে -896768


1
আপনি জাভা কোডটিতে কেন কাস্ট encondindRound2করছেন int? যেহেতু এটি একটি হিসাবে সংজ্ঞায়িত হয়েছে long, আপনি এটি সংকীর্ণ ধরণের কাছে ফেলে দিলে আপনি সম্ভবত যথাযথতা হারাবেন।
জর্ডান

1
@ জর্ডান কারণ - যদি - এর ভিতরে - এটিতে কিছুটা বিপরীত ক্রিয়াকলাপ চলছে। জাভাস্ক্রিপ্ট, যদিও সংখ্যাটি -৪-বিট হিসাবে ভাসমান, বিটওয়াইজ করার সময়, সংখ্যাগুলি 32-বিট পূর্ণসংখ্যায় রূপান্তর করে। আমার আগে এই সমস্যাটি অন্য একটি কোডের সাথে ছিল, যখন জাভা এর সাথে বিটওয়াইজ করে longবিভিন্ন ফলাফল দিয়েছে, কারণ ওভারফ্লো।
পার্সিকার

সরানো হচ্ছে (int)থেকে কাস্ট করার returnলাইন জাভা ফলাফলের পরিবর্তন করে না, এটা রয়ে গেছে-896768
parsecer

4
আহ, আমি বিষয়টি খুঁজে পেয়েছি। আপনি যখন মুখোমুখি হন ... + 0x80000000, জাভা মানটিকে একটি অন্তর্কে রূপান্তর করে, কারণ 0x80000000এটি কোনও আধ্যাত্মিক হিসাবে বিবেচিত হয়। এই নম্বরটি পরিবর্তন করুন 0x80000000L
জর্দান

1
@ জর্ডান বাহ, আপনি উইজার্ড! এটা কাজ করেছে! দয়া করে আপনার উত্তর পোস্ট করুন এবং আমি এটি গ্রহণ করব
পার্সিকার 21

উত্তর:


9

জাভাতে, 0x80000000 একটি 32 বিবিটি ইনট এর সীমার বাইরে, সুতরাং এটি -2147483648 এর কাছাকাছি .েকে দেয়।

জাভাস্ক্রিপ্টে, 0x80000000 ভাল একটি 64 বিট ডাবল এর পরিসীমা মধ্যে, তাই এটি 2147483648 অবশেষ।

স্পষ্টতই, -2147483648বনাম যোগ যোগ করার 2147483648ফলে একটি খুব বড় তাত্পর্য দেখা দেয়।

আপনি longজাভাতে 0x80000000L ব্যবহার করতে পারেন , বা (0x80000000|0)আপনি চান তার উপর নির্ভর করে আপনার জেএস নম্বরটি 32 বিট ইন্টিতে জোর করে।


2

এটা চেষ্টা কর. রূপান্তরটি করার ক্ষেত্রে আপনাকে দীর্ঘ মান নির্দিষ্ট করতে হবে।

    public static long normalizeHash(long encondindRound2) {
        if (encondindRound2 < 0) {
            encondindRound2 =  (encondindRound2 & 0x7fffffffL) + 0x80000000L;
        }

        return  (encondindRound2 % 1_000_000);
    }

তবে আপনার আরও সচেতন হওয়া উচিত issue জাভাস্ক্রিপ্ট %একটি মডুলো অপারেটর হিসাবে বিবেচনা করে যেখানে জাভা এটিকে একটি সাধারণ অবশিষ্ট অপারেটর হিসাবে বিবেচনা করে। আরও তথ্যের জন্য এই পোস্টটি এখানে দেখুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.